
在 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)中的元素;
我們在Python的REPL中進(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》中文版早日出版吧!
