您好,登錄后才能下訂單哦!
小編給大家分享一下python偏函數(shù)的使用方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
偏函數(shù) partial 應(yīng)用
函數(shù)在執(zhí)行時,要帶上所有必要的參數(shù)進行調(diào)用。但是,有時參數(shù)可以在函數(shù)被調(diào)用之前提前獲知。這種情況下,一個函數(shù)有一個或多個參數(shù)預(yù)先就能用上,以便函數(shù)能用更少的參數(shù)進行調(diào)用。
偏函數(shù)是將所要承載的函數(shù)作為partial()函數(shù)的第一個參數(shù),原函數(shù)的各個參數(shù)依次作為partial()函數(shù)后續(xù)的參數(shù),除非使用關(guān)鍵字參數(shù)。
舉一個常見的例子來說明:
我們實現(xiàn)了一個取余函數(shù),對于整數(shù) 100,取得對于不同數(shù) m 的 100%m 的余數(shù)。
from functools import partial def mod( n, m ): return n % m mod_by_100 = partial( mod, 100 ) print mod( 100, 7 ) # 2 print mod_by_100( 7 ) # 2
下面再看一個例子,講的是如何進行不同的進制轉(zhuǎn)換。
from functools import partial bin2dec = partial( int, base=2 ) print bin2dec( '0b10001' ) # 17 print bin2dec( '10001' ) # 17 hex2dec = partial( int, base=16 ) print hex2dec( '0x67' ) # 103 print hex2dec( '67' ) # 103
關(guān)于偏函數(shù),可以對現(xiàn)有函數(shù)進行加強。
>>> import functools >>> int2 =functools.partial (int, base=2) # 把 int 的轉(zhuǎn)換設(shè)為二進制了,這里 base 是 int 函數(shù)表示進制的參數(shù)。 >>>int2('1000000') 64 >>>int2('1010101') 85
在重設(shè)之后, 也可以在函數(shù)調(diào)用時傳入其他值:
>>> int2('1000000', base=10) # 這里 base 變成了 10,覆蓋了已設(shè)的默認(rèn)值 2。 1000000
注意這里在創(chuàng)建新的偏函數(shù)后,依舊可以更改已經(jīng)設(shè)置的默認(rèn)值,但是必須清晰指出是更改了 base 的值。
否則如果直接傳如一個數(shù)值會報錯:
int2('100', 10) # 報錯,10 前未加 base=,不能分辨這是傳給 base 的
原因如下:
創(chuàng)建偏函數(shù)時,實際上可以接收函數(shù)對象、*args 和 **kw 這 3 個參數(shù),當(dāng)傳入:
int2 =functools.partial(int, base=2) # int 是函數(shù)對象,base=2 是 **kw,沒有傳入 *args 參數(shù)
實際上固定了 int() 函數(shù)的關(guān)鍵字參數(shù) base,也就是:
int2('10010')
相當(dāng)于:
kw = { 'base': 2 } int('10010', **kw) # 如果不指明 base=2 而只是傳入 2 的話,那么 2 被認(rèn)為是 *args 的值
當(dāng)傳入:
max2 =functools.partial(max, 10) # 這里的 10 顯然就是作為 *args 里的值傳入的
實際上會把 10 作為 *args 的一部分自動加到參數(shù)列表里去,也就是:
max2(5,6, 7) # 原本有 *args 的列表,然后會把 10 再加進去
相當(dāng)于:
args = (10, 5, 6, 7) max(*args)
結(jié)果為10。
以上是python偏函數(shù)的使用方法的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。