python 偏函數

Python的functools模塊提供了不少有用的功能,其中一個就是偏函數(Partial function)。要注意,這裏的偏函數和數學意義上的偏函數不同。java

在介紹函數參數的時候,咱們講到,經過設定參數的默認值,能夠下降函數調用的難度。而偏函數也能夠作到這一點。舉例以下:python

int()函數能夠把字符串轉換爲整數,當僅傳入字符串時,int()函數默認按十進制轉換:函數

>>> int('12345') 12345 

int()函數還提供額外的base參數,默認值爲10。若是傳入base參數,就能夠作N進制的轉換:spa

>>> int('12345', base=8) 5349 >>> int('12345', 16) 74565 

假設要轉換大量的二進制字符串,每次都傳入int(x, base=2)很是麻煩,因而,咱們想到,能夠定義一個int2()的函數,默認把base=2傳進去:code

def int2(x, base=2): return int(x, base) 

這樣,咱們轉換二進制就很是方便了:對象

>>> int2('1000000') 64 >>> int2('1010101') 85 

functools.partial就是幫助咱們建立一個偏函數的,不須要咱們本身定義int2(),能夠直接使用下面的代碼建立一個新的函數int2字符串

>>> import functools >>> int2 = functools.partial(int, base=2) >>> int2('1000000') 64 >>> int2('1010101') 85 

因此,簡單總結functools.partial的做用就是,把一個函數的某些參數給固定住(也就是設置默認值),返回一個新的函數,調用這個新函數會更簡單。數學

注意到上面的新的int2函數,僅僅是把base參數從新設定默認值爲2,但也能夠在函數調用時傳入其餘值:string

>>> int2('1000000', base=10) 1000000 

最後,建立偏函數時,實際上能夠接收函數對象、*args**kw這3個參數,當傳入:it

int2 = functools.partial(int, base=2) 

實際上固定了int()函數的關鍵字參數base,也就是:

int2('10010')

至關於:

kw = { base: 2 } int('10010', **kw) 

當傳入:

max2 = functools.partial(max, 10) 

實際上會把10做爲*args的一部分自動加到左邊,也就是:

max2(5, 6, 7)

至關於:

args = (10, 5, 6, 7)
max(*args)

結果爲10

小結

當函數的參數個數太多,須要簡化時,使用functools.partial能夠建立一個新的函數,這個新函數能夠固定住原函數的部分參數,從而在調用時更簡單。

相關文章
相關標籤/搜索