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

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

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

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

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

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

def func():

print("in func")

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

func() # 將會(huì)打印出 in func

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

搭噶好我是 C 哥。

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

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

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

print("開始買房")

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

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

偏函數(shù)使用


2. 使用方式

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

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

小張.為C哥買房()

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

言歸正傳??纯雌瘮?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ì)象()

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

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í)候只委托了身份證并沒有提供其他證明,那這時(shí)候 小張去操作時(shí)就會(huì)缺少證明。所以當(dāng) C 哥去讓小張進(jìn)行買房操作時(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ù)。

說到這兒大家就會(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) #

# 通過結(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)用場景

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

偏函數(shù)可以提前給函數(shù)綁定一部分參數(shù),在執(zhí)行時(shí)再傳入另一部分參數(shù)顯得很簡潔。比如我們有一個(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ù) 這么寫即可

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 分享到:
和我們?cè)诰€交談!