Python partial偏函數及用法

2020-07-16 10:05:05
簡單的理解偏函數,它是對原始函數的二次封裝,是將現有函數的部分引數預先繫結為指定值,從而得到一個新的函數,該函數就稱為偏函數。相比原函數,偏函數具有較少的可變引數,從而降低了函數呼叫的難度。

定義偏函數,需使用 partial 關鍵字(位於 functools 模組中),其語法格式如下:

偏函數名 = partial(func, *args, **kwargs)

其中,func 指的是要封裝的原函數,*args 和 **kwargs 分別用於接收無關鍵字實參和關鍵字實參。

有關 *args 和 **kwargs 作為函數形參更詳細的解釋,可閱讀《Python函數可變引數(*args, **kwargs)》一節。

下面舉幾個例子,讓大家可以直觀感受一下偏函數的用法和功能。

【例 1】
from functools import partial
#定義個原函數
def display(name,age):
    print("name:",name,"age:",age)
#定義偏函數,其封裝了 display() 函數,並為 name 引數設定了預設引數
GaryFun = partial(display,name = 'Gary')
#由於 name 引數已經有預設值,因此呼叫偏函數時,可以不指定
GaryFun(age = 13)
執行結果為:

name: Gary age: 13

注意,此程式的第 8 行程式碼中,必須採用關鍵字引數的形式給 age 形參傳參,因為如果以無關鍵字引數的方式,該實參將試圖傳遞給 name 形參,Python直譯器會報 TypeError 錯誤。

【例 2】
from functools import partial

def mod( n, m ):
  return n % m
#定義偏函數,並設定引數 n 對應的實參值為 100
mod_by_100 = partial( mod, 100 )

print(mod( 100, 7 ))
print(mod_by_100( 7 ))
執行結果為:

2
2


結合以上範例不難分析出,偏函數的本質是將函數語言程式設計、預設引數和冗餘引數結合在一起,通過偏函數傳入的引數呼叫關係,與正常函數的引數呼叫關係是一致的。

偏函數通過將任意數量(順序)的引數,轉化為另一個帶有剩餘引數的函數物件,從而實現了擷取函數功能(偏向)的效果。在實際應用中,可以使用一個原函數,然後將其封裝多個偏函數,在呼叫函數時全部呼叫偏函數,一定程式上可以提高程式的可讀性。