借用菜市場一場景,說清Python中的偏函數

借用菜市場一場景,說清Python中的偏函數

偏函數容易讓人聯想到數據中的偏導數,其實不然,兩者之間沒有一點關係。今天的主角名字叫partial。

仔細一琢磨,對於偏函數翻譯還是十分到位的。為啥?偏是和主相對的,有偏函數就應該有主函數。沒有主函數這個偏函數也沒存在的價值。而其真正的價值正如偏將輔助主將一樣,作為主將的一個助手、工具。python 中partial(偏函數)所在的包 functools就明白的其地位。functools不就是函數工具的意思。

主函數是什麼?

python中沒有相對於偏函數的主函數概念,其實這裡“主函數”可以是python中的內置函數,也可以自己定義的函數,沒有什麼特殊的。我們隨便定義的一個函數,例如下面簡單函數就可以做主函數。

def calcutor(quality,price):

total_price = price * quality

return total_price

偏函數是什麼?

接下來我們介紹偏函數怎麼輔助主函數工作。既然一主一偏,這就說明主函數的作用比偏函數能耐大。主將具有運籌帷幄的能力,而偏將就只能有獨擋一面的能力。

首先我們看一下今天主角partial文檔:

Help on class partial in module functools:

class partial(builtins.object)

| partial(func, *args, **keywords) - new function with partial application

| of the given arguments and keywords.

|

看官方描述大概是通過給定函數一個部分參數而生成一個新的函數。 其中func就是要輔助的主函數,而args是要賦值的部分參數。

如果將上面函數看成菜市場的計算機,對於該函數輸入菜的單價和質量,就能計算出購買菜的價錢,這個函數能計算所有菜的價錢。那麼偏函數呢,既然只能獨擋一面,就假設這個偏函數只能計算西紅柿的價錢。

from functools import partial

#西紅柿單價為2元/kg

tomatoes_calcutor = partial(calcutor, price=2)

這時若再計算西紅柿價錢時原來的調用方法是需要查詢一些西紅柿價格表,再輸入質量,最後計算結果(假設購買3kg西紅柿):

total_price = calcutor(3,2)

print(total_price)

結果:

6

而有了偏函數之後,我們只需使用西紅柿的計算器,輸入西紅柿質量就可以了。

total_price = tomatoes_calcutor (3)

print(total_price)

結果:

6

所以這就是根據全能計算器主函數製造出一個西紅柿計算器的偏函數。

當然以上功能裝飾器也可以實現,但是絕非一行代碼所能完成。大道至簡,這也許是很多人喜歡python原因吧。


分享到:


相關文章: