天天看點

python之偏函數

原文

Python的

functools

子產品提供了很多有用的功能,其中一個就是偏函數(Partial function)。要注意,這裡的偏函數和數學意義上的偏函數不一樣。

在介紹函數參數的時候,我們講到,通過設定參數的預設值,可以降低函數調用的難度。而偏函數也可以做到這一點。舉例如下:

int()

函數可以把字元串轉換為整數,當僅傳入字元串時,

int()

函數預設按十進制轉換:
python之偏函數

int()

函數還提供額外的

base

參數,預設值為

10

。如果傳入

base

參數,就可以做N進制的轉換:
python之偏函數
假設要轉換大量的二進制字元串,每次都傳入

int(x, base=2)

非常麻煩,于是,我們想到,可以定義一個

int2()

的函數,預設把

base=2

傳進去:

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

這樣,我們轉換二進制就非常友善了:

python之偏函數

functools.partial就是幫助我們建立一個偏函數的,不需要我們自己定義

int2()

,可以直接使用下面的代碼建立一個新的函數

int2

python之偏函數

是以,簡單總結

functools.partial

的作用就是,把一個函數的某些參數給固定住(也就是設定預設值),傳回一個新的函數,調用這個新函數會更簡單。

注意到上面的新的

int2

函數,僅僅是把

base

參數重新設定預設值為

2

,但也可以在函數調用時傳入其他值:

python之偏函數

最後,建立偏函數時,實際上可以接收函數對象、

*args

**kw

這3個參數,當傳入:

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

可以建立一個新的函數,這個新函數可以固定住原函數的部分參數,進而在調用時更簡單。