關(guān)于Python一等函數(shù)的一點(diǎn)實(shí)踐

流暢的Python

在 Python 中,函數(shù)是一等對象。編程語言理論家把“一等對象”定義為滿足下述條件的程序?qū)嶓w:

  • 在運(yùn)行時創(chuàng)建

  • 能賦值給變量或數(shù)據(jù)結(jié)構(gòu)中的元素

  • 能作為參數(shù)傳給函數(shù)

  • 能作為函數(shù)的返回結(jié)果

—— Guido van Rossum Python 仁慈的獨(dú)裁者 (《流暢的Python》P118)

第一條,(函數(shù))在運(yùn)行時創(chuàng)建,對于腳本語言Python而言,自然不是問題;

第二條: 能賦值給變量或數(shù)據(jù)結(jié)構(gòu)中的元素;

我們在PythonREPL中進(jìn)行如下輸入

>>>def 判斷奇偶數(shù)(整數(shù)):              # 在運(yùn)行時創(chuàng)建一個函數(shù)“判斷奇偶數(shù)”
...     return 整數(shù)%2 == 0
>>>以整數(shù)為參數(shù)的函數(shù) = 判斷奇偶數(shù)     # 將函數(shù)“判斷奇偶數(shù)”賦值給變量"以整數(shù)為參數(shù)的函數(shù)"
>>>print(以整數(shù)為參數(shù)的函數(shù))               # 將變量打印出來
<function 判斷奇偶數(shù) at 0x1076e2510>
>>>以整數(shù)為參數(shù)的函數(shù)(9)
False

從運(yùn)行結(jié)果來看,在運(yùn)行時創(chuàng)建函數(shù),并把函數(shù)賦值給變量沒有問題,而且被賦值之后的變量“以整數(shù)為參數(shù)的函數(shù)”就是一個可以被執(zhí)行的函數(shù)了。


第三條,能作為參數(shù)傳給函數(shù)

要實(shí)現(xiàn)這點(diǎn),我們首先得構(gòu)造一個參數(shù)是函數(shù)的函數(shù)

>>> def 第一個參數(shù)是函數(shù)的函數(shù)(函數(shù), 數(shù)值):
...     return 函數(shù)(數(shù)值)
...
>>>

然后把前面定義的函數(shù)“判斷奇偶數(shù)”當(dāng)做參數(shù)傳遞給“第一個參數(shù)是函數(shù)的函數(shù)”

>>>第一個參數(shù)是函數(shù)的函數(shù)(判斷奇偶數(shù),10)
True
>>>第一個參數(shù)是函數(shù)的函數(shù)(以整數(shù)為參數(shù)的函數(shù), 9)    # 我們也可以把 變量“以整數(shù)為參數(shù)的函數(shù)”當(dāng)參數(shù)
False

看來,以“函數(shù)”做為“函數(shù)的參數(shù)”也沒有什么問題,雖然說起來有點(diǎn)拗口??。


第四條:能作為函數(shù)的返回結(jié)果

同上,要實(shí)現(xiàn)這一點(diǎn),我們要構(gòu)造一個“以函數(shù)為返回值的函數(shù)

>>>def 以函數(shù)為返回值的函數(shù)(函數(shù)):
...     return 函數(shù)
...
>>>以函數(shù)為返回值的函數(shù)(判斷奇偶數(shù))(6)     # “以函數(shù)為返回值的函數(shù)”返回了“判斷奇偶數(shù)”
True

我們可以再構(gòu)造一個有兩個參數(shù)的函數(shù)試試

>>>def 有兩個參數(shù)的函數(shù)(參數(shù)1, 參數(shù)2):
...     return 參數(shù)1 > 參數(shù)2
...
>>>以函數(shù)為返回值的函數(shù)(有兩個參數(shù)的函數(shù))(100, 101)
False

也沒有問題!


從上面的例子我們可以看到Python作為一門腳本語言的簡練和易用之處。

當(dāng)然,有時候也會出些問題,比如,參數(shù)不滿足要求

>>> 第一個參數(shù)是函數(shù)的函數(shù)(有兩個參數(shù)的函數(shù),10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in 第一個參數(shù)是函數(shù)的函數(shù)
TypeError: 有兩個參數(shù)的函數(shù)() missing 1 required positional argument: '參數(shù)2'

這種時候,我們就要小心謹(jǐn)慎一些咯???♀?

寫成有注解的函數(shù)有可能會給我們提個醒 ——

def 有注解的函數(shù)(文本:str, 長度:int)->str:
...     return 文本[:長度].rstrip()
>>> 有注解的函數(shù)("abcdefghijklmn",5)
'abcde'

函數(shù)注解的最大影響 ... 是為 IDE 和 lint 程序等工具中的靜態(tài)類型檢查功能提供額外的類型信息。
—— 《流暢的Python》 P132


前述這些只是讓我們學(xué)習(xí)Python函數(shù)式編程簡單了解一點(diǎn)概念,Python函數(shù)式編程 可以玩出很多的花樣來。 讓我們期待這本 《Functional Python Programming, Second Edition》中文版早日出版吧!

Python函數(shù)式編程 第二版

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容