Python 提供了一個 functools 的模塊,該模塊為高階函數(shù)提供支持,partial 就是其中的一個函數(shù),該函數(shù)的形式如下:
functools.partial(func[,*args][, **kwargs])
這里先舉個例子,看看它是怎么用的。
假設(shè)有如下函數(shù):
def multiply(x, y):
return x * y
現(xiàn)在,我們想返回某個數(shù)的雙倍,即:
>>> multiply(3, y=2)
6
>>> multiply(4, y=2)
8
>>> multiply(5, y=2)
10
上面的調(diào)用有點繁瑣,每次都要傳入 y=2,我們想到可以定義一個新的函數(shù),把 y=2 作為默認值,即:
def double(x, y=2):
return multiply(x, y)
現(xiàn)在,我們可以這樣調(diào)用了:
>>> double(3)
6
>>> double(4)
8
>>> double(5)
10
事實上,我們可以不用自己定義 double,利用 partial,我們可以這樣:
from functools import partial
double = partial(multiply, y=2)
partial 接收函數(shù) multiply 作為參數(shù),固定 multiply 的參數(shù) y=2,并返回一個新的函數(shù)給 double,這跟我們自己定義 double 函數(shù)的效果是一樣的。
所以,簡單而言,partial 函數(shù)的功能就是:把一個函數(shù)的某些參數(shù)給固定住,返回一個新的函數(shù)。
需要注意的是,我們上面是固定了 multiply 的關(guān)鍵字參數(shù) y=2,如果直接使用:
double = partial(multiply, 2)
則 2 是賦給了 multiply 最左邊的參數(shù) x,不信?我們可以驗證一下:
from functools import partial
def subtraction(x, y):
return x - y
f = partial(subtraction, 4) # 4 賦給了 x
>>> f(10) # 4 - 10
-6
functools.partial 創(chuàng)建一個新的函數(shù)。