Python的functools
模塊提供了很多有用的功能鹰椒,其中一個(gè)就是偏函數(shù)(Partial function)腐泻。要注意鹊漠,這里的偏函數(shù)和數(shù)學(xué)意義上的偏函數(shù)不一樣几缭。
在介紹函數(shù)參數(shù)的時(shí)候想许,我們講到伶授,通過設(shè)定參數(shù)的默認(rèn)值,可以降低函數(shù)調(diào)用的難度流纹。而偏函數(shù)也可以做到這一點(diǎn)糜烹。舉例如下:
int()
函數(shù)可以把字符串轉(zhuǎn)換為整數(shù),當(dāng)僅傳入字符串時(shí)漱凝,int()
函數(shù)默認(rèn)按十進(jìn)制轉(zhuǎn)換:
>>> int('12345')
12345
但int()
函數(shù)還提供額外的base
參數(shù)疮蹦,默認(rèn)值為10
。如果傳入base
參數(shù)茸炒,就可以做N進(jìn)制的轉(zhuǎn)換:
>>> int('12345', base=8)
5349
>>> int('12345', 16)
74565
假設(shè)要轉(zhuǎn)換大量的二進(jìn)制字符串愕乎,每次都傳入int(x, base=2)
非常麻煩,于是扣典,我們想到妆毕,可以定義一個(gè)int2()
的函數(shù),默認(rèn)把base=2
傳進(jìn)去:
def int2(x, base=2):
return int(x, base)
這樣贮尖,我們轉(zhuǎn)換二進(jìn)制就非常方便了:
>>> int2('1000000')
64
>>> int2('1010101')
85
functools.partial
就是幫助我們創(chuàng)建一個(gè)偏函數(shù)的笛粘,不需要我們自己定義int2()
,可以直接使用下面的代碼創(chuàng)建一個(gè)新的函數(shù)int2
:
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85
所以湿硝,簡(jiǎn)單總結(jié)functools.partial
的作用就是薪前,把一個(gè)函數(shù)的某些參數(shù)給固定住(也就是設(shè)置默認(rèn)值)关斜,返回一個(gè)新的函數(shù)示括,調(diào)用這個(gè)新函數(shù)會(huì)更簡(jiǎn)單。
注意到上面的新的int2
函數(shù)痢畜,僅僅是把base
參數(shù)重新設(shè)定默認(rèn)值為2
垛膝,但也可以在函數(shù)調(diào)用時(shí)傳入其他值:
>>> int2('1000000', base=10)
1000000
最后鳍侣,創(chuàng)建偏函數(shù)時(shí),實(shí)際上可以接收函數(shù)對(duì)象吼拥、*args
和**kw
這3個(gè)參數(shù)倚聚,當(dāng)傳入:
int2 = functools.partial(int, base=2)
實(shí)際上固定了int()函數(shù)的關(guān)鍵字參數(shù)base
,也就是:
int2('10010')
相當(dāng)于:
kw = { 'base': 2 }
int('10010', **kw)
當(dāng)傳入:
max2 = functools.partial(max, 10)
實(shí)際上會(huì)把10
作為*args
的一部分自動(dòng)加到左邊凿可,也就是:
max2(5, 6, 7)
相當(dāng)于:
args = (10, 5, 6, 7)
max(*args)
結(jié)果為10
惑折。
小結(jié)
當(dāng)函數(shù)的參數(shù)個(gè)數(shù)太多,需要簡(jiǎn)化時(shí)枯跑,使用functools.partial
可以創(chuàng)建一個(gè)新的函數(shù)惨驶,這個(gè)新函數(shù)可以固定住原函數(shù)的部分參數(shù),從而在調(diào)用時(shí)更簡(jiǎn)單敛助。