更新時(shí)間:2019年09月12日16時(shí)34分 來(lái)源:傳智播客 瀏覽次數(shù):
1. 偏函數(shù)是什么
先回顧一下我們使用函數(shù)的過(guò)程。首先我們先定義一個(gè)函數(shù),如
def func():
print("in func")
然后我們調(diào)用這個(gè)函數(shù),即執(zhí)行代碼, 如
func() # 將會(huì)打印出 in func
接下來(lái)我們說(shuō)一說(shuō)偏函數(shù)。
搭噶好我是 C 哥。
假設(shè)我通過(guò)學(xué)習(xí)編程走上人生巔峰,腰纏萬(wàn)貫,接下來(lái)需要購(gòu)置房產(chǎn)安家平天下。接下來(lái)我們的時(shí)間很寶貴,我不太可能把自己投入到 看盤(pán)、選盤(pán)、議價(jià)、交定金、簽合同、過(guò)戶(hù)等耗費(fèi)時(shí)間的事情上。此時(shí)我可能會(huì)考慮請(qǐng)一個(gè)房產(chǎn)中介來(lái)幫助完成這一系列事情。所謂偏函數(shù),通俗解釋偏函數(shù)就是我們的一個(gè)房產(chǎn)中介。不管是我自己還是房產(chǎn)中介買(mǎi)房做的步驟其實(shí)都是一樣,只是是中介花時(shí)間去完成的。
這就好比有一個(gè)買(mǎi)房的函數(shù)
def 為C哥買(mǎi)房(身份證,無(wú)房證明,單身證明):
print("開(kāi)始買(mǎi)房")
如果是我們自己親力親為則需要這樣調(diào)用
我.為C哥買(mǎi)房('身份證號(hào)碼','證明房產(chǎn)的證據(jù)','證明單身的證據(jù)')
2. 使用方式
? 接下來(lái)我們來(lái)看看偏函數(shù)的使用方式。先回到故事,我先把買(mǎi)房操作需要的數(shù)據(jù)交給中介公司,然后由中介公司的一個(gè)員工替我執(zhí)行這個(gè)買(mǎi)房操作即可。
小張 = 中介公司('身份證號(hào)碼','證明房產(chǎn)的證據(jù)','證明單身的證據(jù)')
小張.為C哥買(mǎi)房()
? 所以仿函數(shù)其實(shí)就是一個(gè)代理。我們?yōu)榱烁?jiǎn)單的操作,可以使用仿函數(shù)代理幫我們?nèi)?zhí)行一段代碼邏輯,當(dāng)然這個(gè)功能所需的參數(shù)數(shù)據(jù)要求我們自己提供,總不能讓中介用他的身份證給 C 哥買(mǎi)房吧哈哈哈。
言歸正傳。看看偏函數(shù)的用法。
# 1 創(chuàng)建中介對(duì)象 并給這個(gè)對(duì)象傳參 告訴他做什么事情 需要哪些數(shù)據(jù)
# partial對(duì)象 函數(shù)代碼入口(函數(shù)名) 函數(shù)參數(shù)
partial對(duì)象 = functools.partial(func, *args, **keywords)
# 2 讓中介對(duì)象 執(zhí)行我們委托給他的任務(wù)
partial對(duì)象()
用法明確了,接下來(lái)我們看看具體代碼。
from functools import partial # 導(dǎo)入偏函數(shù)
# 定義操作
def add(number1, number2, number3):
return number1 + number2 + number3
# 定義偏partial函數(shù)對(duì)象
p = partial(add, 100, 99, 100)
# 調(diào)用partial對(duì)象 執(zhí)行功能
print(p()) # 執(zhí)行結(jié)果是 299
然而這并不是偏函數(shù)的所有使用方式,以上這種情況太理想。更加實(shí)際的情況是這樣的。
首先回到故事,有可能 C 哥在委托中介的時(shí)候只委托了身份證并沒(méi)有提供其他證明,那這時(shí)候 小張去操作時(shí)就會(huì)缺少證明。所以當(dāng) C 哥去讓小張進(jìn)行買(mǎi)房操作時(shí)還應(yīng)該補(bǔ)齊剩余所需的數(shù)據(jù)。
回到python代碼,同理我們?cè)趧?chuàng)建偏函數(shù)對(duì)象時(shí)可以只傳入一 部分 參數(shù),在執(zhí)行偏函數(shù)對(duì)象時(shí)再傳入剩余 部分 的參數(shù)。(所謂 partial 就是部分的意思,多多理解這里部分的含義)
所以可能代碼會(huì)變成這樣
from functools import partial # 導(dǎo)入偏函數(shù)
# 定義操作
def add(number1,number2,number3):
return number1 + number2 + number3
# 定義偏partial函數(shù)對(duì)象
p = partial(add, 100, 99)
# 調(diào)用partial對(duì)象 執(zhí)行功能
print(p()) # 報(bào)錯(cuò) 因?yàn)槿鄙僖粋€(gè)必要的位置參數(shù)
print(p(100)) # 執(zhí)行結(jié)果是 299
print(p(101)) # 執(zhí)行結(jié)果是 300
3. 偏函數(shù)對(duì)象剖析
再次強(qiáng)調(diào)一下 偏函數(shù)就是一個(gè)中介,中介幫我們執(zhí)行委托的任務(wù),并且要求我們提供任務(wù)相關(guān)數(shù)據(jù)。
說(shuō)到這兒大家就會(huì)很好奇偏函數(shù)是怎么做到的。
首先當(dāng)我們創(chuàng)建一個(gè) partial 對(duì)象時(shí)這個(gè)對(duì)象只做了一件事就是 保存需要執(zhí)行的目標(biāo)代碼入口(函數(shù)名)。
from functools import partial # 導(dǎo)入偏函數(shù)
# 定義操作
def add(number1,number2,number3):
return number1 + number2 + number3
# 定義偏partial函數(shù)對(duì)象
p = partial(add, 100, number2=99)
# 獲取對(duì)象中保存的 目標(biāo)代碼入口
print(p.func) #
print(add) #
# 通過(guò)結(jié)果驗(yàn)證: 當(dāng)我們使用 p(100)時(shí)會(huì)執(zhí)行 p 對(duì)象的__call__方法導(dǎo)致執(zhí)行 p.func
# 如果想要查看 partial 對(duì)象相關(guān)參數(shù)
print(p.args) # 獲取目標(biāo)代碼 相關(guān)的位置參數(shù) (100,)
print(p.keywords) # 獲取目標(biāo)代碼 相關(guān)的關(guān)鍵字參數(shù) {'number2': 99}
? 再次強(qiáng)調(diào)一下 偏函數(shù)就是一個(gè)中介,中介幫我們執(zhí)行委托的任務(wù),并且要求我們提供任務(wù)相關(guān)數(shù)據(jù)。
4. 應(yīng)用場(chǎng)景
接下來(lái)咱們說(shuō)一說(shuō)偏函數(shù)在實(shí)際開(kāi)發(fā)中的應(yīng)用場(chǎng)景:
偏函數(shù)可以提前給函數(shù)綁定一部分參數(shù),在執(zhí)行時(shí)再傳入另一部分參數(shù)顯得很簡(jiǎn)潔。比如我們有一個(gè)函數(shù)需要計(jì)算兩個(gè)日期之間的天數(shù)。
def getDays(date1, date2):
實(shí)現(xiàn)省略
return 間隔天數(shù)
在很多情況下可能第一個(gè)參數(shù)就是一個(gè)固定的日期 比如
# 求'2019-07-01',現(xiàn)在我想要計(jì)算這一天到'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ù) 這么寫(xiě)即可
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')
而這樣提供的語(yǔ)法便利是 函數(shù)的默認(rèn)參數(shù)所不能達(dá)到的。
推薦了解:
python+人工智能課程
大數(shù)據(jù)培訓(xùn)課程
北京校區(qū)