您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python中如何使用偏函數,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
偏函數 partial 應用
函數在執行時,要帶上所有必要的參數進行調用。但是,有時參數可以在函數被調用之前提前獲知。這種情況下,一個函數有一個或多個參數預先就能用上,以便函數能用更少的參數進行調用。
偏函數是將所要承載的函數作為partial()函數的第一個參數,原函數的各個參數依次作為partial()函數后續的參數,除非使用關鍵字參數。
通過語言描述可能無法理解偏函數是怎么使用的,那么就舉一個常見的例子來說明。在這個例子里,我們實現了一個取余函數,對于整數 100,取得對于不同數 m 的 100%m 的余數。
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
由于之前看到的例子一般選擇加法或乘法來講解,無法體會偏函數參數的位置問題,容易給人造成 partial 的第二個參數也是原函數的第二個參數的假象,所以我在這里選擇 mod 來講解。
而對于有關鍵字參數的情況下,就可以不按照原函數的參數位置和個數了。下面再看一個例子,講的是如何進行不同的進制轉換。
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
偏函數的這些應用看似簡單,用途卻很大,可以很好的執行DRY原則,節省編程成本。
關于偏函數,可以對現有函數進行加強。
>>> import functools >>> int2 =functools.partial (int, base=2) # 把 int 的轉換設為二進制了,這里 base 是 int 函數表示進制的參數。 >>>int2('1000000') 64 >>>int2('1010101') 85
在重設之后, 也可以在函數調用時傳入其他值:
>>> int2('1000000', base=10) # 這里 base 變成了 10,覆蓋了已設的默認值 2。 1000000
注意這里在創建新的偏函數后,依舊可以更改已經設置的默認值,但是必須清晰指出是更改了 base 的值。
否則如果直接傳如一個數值會報錯:
int2('100', 10) # 報錯,10 前未加 base=,不能分辨這是傳給 base 的
原因如下:
創建偏函數時,實際上可以接收函數對象、*args 和 **kw 這 3 個參數,當傳入:
int2 =functools.partial(int, base=2) # int 是函數對象,base=2 是 **kw,沒有傳入 *args 參數
實際上固定了 int() 函數的關鍵字參數 base,也就是:
int2('10010')
相當于:
kw = { 'base': 2 } int('10010', **kw) # 如果不指明 base=2 而只是傳入 2 的話,那么 2 被認為是 *args 的值
當傳入:
max2 =functools.partial(max, 10) # 這里的 10 顯然就是作為 *args 里的值傳入的
實際上會把 10 作為 *args 的一部分自動加到參數列表里去,也就是:
max2(5,6, 7) # 原本有 *args 的列表,然后會把 10 再加進去
相當于:
args = (10, 5, 6, 7) max(*args)
結果為 10。
關于Python中如何使用偏函數就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。