1. 程式人生 > 實用技巧 >python 的偏函式(Partial function)

python 的偏函式(Partial function)

關於偏函式這個知識點,廖雪峰老師官網說的比較簡單,我就再參考了另外一個花裡花俏的園子: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 + n
    
return 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進行求餘 -- 新函式--偏函式產生

總的來說,原函式裡面使用的命名關鍵字引數,我們用偏函式時,可以重新對裡面的命名關鍵字引數賦值