Python 代碼閲讀合集介紹:為什麼不推薦Python初學者直接看項目源碼
本篇閲讀的代碼實現了將函數柯里化的功能。
在計算機科學中,柯里化(英語:Currying),又譯為卡瑞化或加里化,是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,並且返回接受餘下的參數而且返回結果的新函數的技術。
本篇閲讀的代碼片段來自於30-seconds-of-python。
curry
from functools import partial
def curry(fn, *args):
return partial(fn,*args)
# EXAMPLES
add = lambda x, y: x + y
add10 = curry(add, 10)
add10(20) # 30
curry函數接收一個接受多個參數的初始函數和部分參數,返回接受單一參數的函數。
函數使用functools.partial()生成一個部分對象。該部分對象被調用時的行為類似於fn給定了部分參數被調用,需要提供剩餘參數。
在直覺上,柯里化聲稱“如果你固定某些參數,你將得到接受餘下參數的一個函數”。所以對於有兩個變量的函數x+y,如果固定了y=2,則得到有一個變量的函數x+2。
functools.partial(func, /, *args, **keywords)
返回一個新的 部分對象,當被調用時其行為類似於 func 附帶位置參數args和關鍵字參數keywords被調用。 如果為調用提供了更多的參數,它們會被附加到args。 如果提供了額外的關鍵字參數,它們會擴展並重載keywords。 大致等價於:
def partial(func, /, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = {**keywords, **fkeywords}
return func(*args, *fargs, **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc