Python用了這么久,居然沒(méi)注意到這個(gè)騷操作函數(shù)
導(dǎo)讀
Python語(yǔ)言近年來(lái)的火熱程度自不必說(shuō),這一方面得益于其龐大的第三方庫(kù)的加持,使得其堪稱(chēng)萬(wàn)金油般的存在;另一方面也在于其簡(jiǎn)潔的語(yǔ)法和易用的函數(shù)。是的,Python語(yǔ)法之簡(jiǎn)潔和函數(shù)之豐富,使得眾多Python愛(ài)好者常常調(diào)侃一句:人生苦短,我用Python。鑒于此,今天本文就來(lái)分享一個(gè)Python中實(shí)用而又略顯騷氣的函數(shù)——partial!

Python語(yǔ)言中的partial函數(shù)是一個(gè)高級(jí)函數(shù),當(dāng)我們提及高級(jí)函數(shù)時(shí),其背后一般隱含著的一層信息是函數(shù)式編程。說(shuō)函數(shù)式編程可能并不不是那么人盡皆知,所以這里還有必要先拓展談一談編程語(yǔ)言的范式!
當(dāng)前,編程語(yǔ)言的主流范式可區(qū)分以下3種:
面向過(guò)程
面向?qū)ο?/span>
函數(shù)式

這才叫真正的面向?qū)ο缶幊?/span>
理解完類(lèi)和對(duì)象的概念,那么面向?qū)ο缶幊?/span>則是指將一類(lèi)事物封裝成類(lèi),而后執(zhí)行操作和查找取值時(shí)則使用該類(lèi)創(chuàng)建的對(duì)象來(lái)完成,典型畫(huà)風(fēng)是這樣的:某對(duì)象執(zhí)行什么什么操作,某對(duì)象取什么什么屬性值,這里都是在用對(duì)象來(lái)調(diào)用方法或?qū)傩?,體現(xiàn)的思想就是面向?qū)ο蟆?/span>

partial函數(shù)封裝在python的內(nèi)置庫(kù)functools中(從該庫(kù)的名字就可以推斷,這是一批關(guān)于函數(shù)的工具,但實(shí)際上并沒(méi)有太多常用的函數(shù),曾經(jīng)有一個(gè)reduce現(xiàn)在也不大提倡使用了),用于對(duì)一個(gè)函數(shù)應(yīng)用部分參數(shù)或關(guān)鍵字參數(shù),并返回一個(gè)新函數(shù)。
實(shí)際上,所以這里partial的函數(shù)中文名叫部分應(yīng)用函數(shù),即提供函數(shù)的一部分參數(shù),從而簡(jiǎn)化其后續(xù)調(diào)用。talk is cheap, show me the code!
def makeAnimal(type_, name, sex, friendly):print(f"Generate an animal: type={type_}, name={name}, sex={sex}, friendly={friendly}")makeAnimal("狗", "二哈", "雄", True)# 輸出:Generate an animal: type=狗, name=二哈, sex=雄, friendly=TruemakeDog = partial(makeAnimal, "狗", friendly=True)# 基于makeAnimal得到部分應(yīng)用函數(shù),并分別傳入一個(gè)參數(shù)和關(guān)鍵字參數(shù)# 此時(shí)makeDog僅剩下兩個(gè)參數(shù):name, sexmakeDog("旺財(cái)", "雌")# 輸出:Generate an animal: type=狗, name=旺財(cái), sex=雌, friendly=True
最后簡(jiǎn)單總結(jié)一下:partial函數(shù)提供了對(duì)所接收函數(shù)的部分應(yīng)用功能,常用于對(duì)一個(gè)參數(shù)較多的函數(shù)先傳入一部分固定的參數(shù),返回一個(gè)參數(shù)相對(duì)精簡(jiǎn)的新函數(shù),從而更利于后續(xù)的調(diào)用。本質(zhì)上,該功能可通過(guò)Python中的默認(rèn)參數(shù)等來(lái)替代實(shí)現(xiàn),但對(duì)于豐富Python語(yǔ)法特性、提高代碼工程化水平,partial又何嘗不是一個(gè)更好的選擇呢?

相關(guān)閱讀:
