python 的偏函式(Partial function)
阿新 • • 發佈:2020-07-14
關於偏函式這個知識點,廖雪峰老師官網說的比較簡單,我就再參考了另外一個花裡花俏的園子:https://www.cnblogs.com/sui776265233/p/9881628.html#_label0
先引出偏函式
#一個帶有可變引數的sum函式 def sum(*args): s=0 for i in args: s=s+n return s #想要輸出(sum(10,20)+sum(1,2,3,4,5)) print(sum(10,20)+sum(1,2,3,4,5))
這樣雖然通俗易懂,但是很邋遢不專業
於是改為可變引數+關鍵字引數組合
def sum(*args,**others): s=0 for i in args: s=s+i s1=0 for k in others: s1=s1+others[k] return s+s1 D= {'value1':10,'value2':20} print(sum(1,2,3,4,5,**D))
這樣描寫所說專業了,到那時很冗餘,不是python的風格,於是就引出了偏函式
from functools import partial def sum(*args): s = 0 for n in args: s = s + nreturn s sum_add_10 = partial(sum,10) #10 作用在sum第一個引數的位置 sum_add_10_20 = partial(sum,10,20) #10 20 分別作用在sum第一個和第二個引數的位置 print('A____________我們看下原函式sum的函式地址入口:') print(sum) print('B______我們看下partial函式返回函式的地址入口:') print(partial(sum,10)) print(sum_add_10(1,2,3,4,5)) # 10 + 1 + 2 + 3 + 4 + 5 = 25 sum_add_10 實際上等同於sum(10,*args)print(sum_add_10_20(1,2,3,4,5)) # 10 + 20 + 1 + 2 + 3 + 4 + 5 = 45
partial函式的作用就是:將所作用的函式作為partial()函式的第一個引數,原函式的各個引數依次作為partial()函式的後續引數,原函式有關鍵字引數的一定要帶上關鍵字,沒有的話,按原有引數順序進行補充
偏函式partial一共有三個部分
(1)第一個引數是一個函式或者是python內建函式
(2)第二個引數是一個勒邊引數
(3)第二個引數可以是一個命名關鍵字引數,比如內建函式int的第二個引數就是命名關鍵字引數,預設base=10,表示int轉換時預設是10進位制的
偏函式的demo:
from functools import partial partial(func,*args)
注意偏函式的第三部分(命名關鍵字引數)
案例:我們定義一個mod求餘函式,兩個引數,一個是被除數,一個是除數,除數我們這裡用命名關鍵字引數表示,預設值2
擴充套件:我們的除數不固定,可以是對2就行求餘,也可以對3,對4,總之我們需要指定除數的值
返回結果: True 或 False
import functools def mod(m,*,key=2): return m % key == 0 mod_to_2 = functools.partial(mod,key=2) print('A__3___使用原函式的預設關鍵字引數對2進行求餘:') print(mod(3)) #對2進行求餘-- 原函式 使用預設引數 print('B__3___使用偏函式對2進行求餘:') print(mod_to_2(3)) #對2進行求餘-- 新函式 --偏函式產生 mod_to_5 = functools.partial(mod,key=5) print('C__25___使用原函式的關鍵字引數對5進行求餘:') print(mod(25,key=5)) #對5進行求餘 -- 原函式 print('D__25___使用偏函式對5進行求餘:') print(mod_to_5(25)) #對5進行求餘 -- 新函式--偏函式產生
總的來說,原函式裡面使用的命名關鍵字引數,我們用偏函式時,可以重新對裡面的命名關鍵字引數賦值