教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

偏函數(shù)是什么?Functools模塊偏函數(shù)詳解

更新時間:2019年09月12日16時34分 來源:傳智播客 瀏覽次數(shù):

1. 偏函數(shù)是什么

先回顧一下我們使用函數(shù)的過程。首先我們先定義一個函數(shù),如

def func():

print("in func")

然后我們調(diào)用這個函數(shù),即執(zhí)行代碼, 如

func() # 將會打印出 in func

接下來我們說一說偏函數(shù)。

搭噶好我是 C 哥。

假設(shè)我通過學(xué)習(xí)編程走上人生巔峰,腰纏萬貫,接下來需要購置房產(chǎn)安家平天下。接下來我們的時間很寶貴,我不太可能把自己投入到 看盤、選盤、議價、交定金、簽合同、過戶等耗費時間的事情上。此時我可能會考慮請一個房產(chǎn)中介來幫助完成這一系列事情。所謂偏函數(shù),通俗解釋偏函數(shù)就是我們的一個房產(chǎn)中介。不管是我自己還是房產(chǎn)中介買房做的步驟其實都是一樣,只是是中介花時間去完成的。

這就好比有一個買房的函數(shù)

def 為C哥買房(身份證,無房證明,單身證明):

print("開始買房")

如果是我們自己親力親為則需要這樣調(diào)用

我.為C哥買房('身份證號碼','證明房產(chǎn)的證據(jù)','證明單身的證據(jù)')

偏函數(shù)使用


2. 使用方式

? 接下來我們來看看偏函數(shù)的使用方式。先回到故事,我先把買房操作需要的數(shù)據(jù)交給中介公司,然后由中介公司的一個員工替我執(zhí)行這個買房操作即可。

小張 = 中介公司('身份證號碼','證明房產(chǎn)的證據(jù)','證明單身的證據(jù)')

小張.為C哥買房()

? 所以仿函數(shù)其實就是一個代理。我們?yōu)榱烁唵蔚牟僮?,可以使用仿函?shù)代理幫我們?nèi)?zhí)行一段代碼邏輯,當(dāng)然這個功能所需的參數(shù)數(shù)據(jù)要求我們自己提供,總不能讓中介用他的身份證給 C 哥買房吧哈哈哈。

言歸正傳??纯雌瘮?shù)的用法。

# 1 創(chuàng)建中介對象 并給這個對象傳參 告訴他做什么事情 需要哪些數(shù)據(jù)

# partial對象 函數(shù)代碼入口(函數(shù)名) 函數(shù)參數(shù)

partial對象 = functools.partial(func, *args, **keywords)

# 2 讓中介對象 執(zhí)行我們委托給他的任務(wù)

partial對象()

用法明確了,接下來我們看看具體代碼。

from functools import partial # 導(dǎo)入偏函數(shù)

# 定義操作

def add(number1, number2, number3):

return number1 + number2 + number3

# 定義偏partial函數(shù)對象

p = partial(add, 100, 99, 100)

# 調(diào)用partial對象 執(zhí)行功能

print(p()) # 執(zhí)行結(jié)果是 299

然而這并不是偏函數(shù)的所有使用方式,以上這種情況太理想。更加實際的情況是這樣的。

首先回到故事,有可能 C 哥在委托中介的時候只委托了身份證并沒有提供其他證明,那這時候 小張去操作時就會缺少證明。所以當(dāng) C 哥去讓小張進(jìn)行買房操作時還應(yīng)該補齊剩余所需的數(shù)據(jù)。

回到python代碼,同理我們在創(chuàng)建偏函數(shù)對象時可以只傳入一 部分 參數(shù),在執(zhí)行偏函數(shù)對象時再傳入剩余 部分 的參數(shù)。(所謂 partial 就是部分的意思,多多理解這里部分的含義)

所以可能代碼會變成這樣

from functools import partial # 導(dǎo)入偏函數(shù)

# 定義操作

def add(number1,number2,number3):

return number1 + number2 + number3

# 定義偏partial函數(shù)對象

p = partial(add, 100, 99)

# 調(diào)用partial對象 執(zhí)行功能

print(p()) # 報錯 因為缺少一個必要的位置參數(shù)

print(p(100)) # 執(zhí)行結(jié)果是 299

print(p(101)) # 執(zhí)行結(jié)果是 300

3. 偏函數(shù)對象剖析

再次強調(diào)一下 偏函數(shù)就是一個中介,中介幫我們執(zhí)行委托的任務(wù),并且要求我們提供任務(wù)相關(guān)數(shù)據(jù)。

說到這兒大家就會很好奇偏函數(shù)是怎么做到的。

首先當(dāng)我們創(chuàng)建一個 partial 對象時這個對象只做了一件事就是 保存需要執(zhí)行的目標(biāo)代碼入口(函數(shù)名)。

from functools import partial # 導(dǎo)入偏函數(shù)

# 定義操作

def add(number1,number2,number3):

return number1 + number2 + number3

# 定義偏partial函數(shù)對象

p = partial(add, 100, number2=99)

# 獲取對象中保存的 目標(biāo)代碼入口

print(p.func) #

print(add) #

# 通過結(jié)果驗證: 當(dāng)我們使用 p(100)時會執(zhí)行 p 對象的__call__方法導(dǎo)致執(zhí)行 p.func

# 如果想要查看 partial 對象相關(guān)參數(shù)

print(p.args) # 獲取目標(biāo)代碼 相關(guān)的位置參數(shù) (100,)

print(p.keywords) # 獲取目標(biāo)代碼 相關(guān)的關(guān)鍵字參數(shù) {'number2': 99}

? 再次強調(diào)一下 偏函數(shù)就是一個中介,中介幫我們執(zhí)行委托的任務(wù),并且要求我們提供任務(wù)相關(guān)數(shù)據(jù)。

4. 應(yīng)用場景

接下來咱們說一說偏函數(shù)在實際開發(fā)中的應(yīng)用場景:

偏函數(shù)可以提前給函數(shù)綁定一部分參數(shù),在執(zhí)行時再傳入另一部分參數(shù)顯得很簡潔。比如我們有一個函數(shù)需要計算兩個日期之間的天數(shù)。

def getDays(date1, date2):

實現(xiàn)省略

return 間隔天數(shù)

在很多情況下可能第一個參數(shù)就是一個固定的日期 比如

# 求'2019-07-01',現(xiàn)在我想要計算這一天到'2050-01-01'以及 的天數(shù)

getDays('2019-07-01', '2050-01-01')

# 求'2019-07-01'到'2020-01-01'以及 的天數(shù)

getDays('2019-07-01', '2020-01-01')

getDays('2019-07-01', '2017-01-01')

getDays('2019-07-01', '2017-08-17')

# 如果有偏函數(shù) 可以提前提供部分參數(shù) 這么寫即可

from functools import partial

g1 = partial(getDays, '2019-07-01')

g1('2050-01-01')

g1('2020-01-01')

g1('2017-01-01')

g1('2017-08-17')

# 如果起始日期需要變化

g2 = partial(getDays, '2018-09-08')

g2('2050-01-01')

g2('2020-01-01')

g2('2017-01-01')

g2('2017-08-17')

而這樣提供的語法便利是 函數(shù)的默認(rèn)參數(shù)所不能達(dá)到的。


推薦了解:
python+人工智能課程
大數(shù)據(jù)培訓(xùn)課程

0 分享到:
和我們在線交談!