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