關於Python一等函式的一點實踐
在 Python 中,函式是一等物件。程式語言理論家把“一等物件”定義為滿足下述條件的程式實體:
在執行時建立
能賦值給變數或資料結構中的元素
能作為引數傳給函式
能作為函式的返回結果
—— Guido van Rossum Python 仁慈的獨裁者 (《流暢的Python》P118)
第一條,(函式)在執行時建立,對於指令碼語言Python而言,自然不是問題;
第二條: 能賦值給變數或資料結構中的元素;
我們在Python的REPL中進行如下輸入
>>>def 判斷奇偶數(整數): # 在執行時建立一個函式“判斷奇偶數”
... return 整數%2 == 0
>>>以整數為引數的函式 = 判斷奇偶數 # 將函式“判斷奇偶數”賦值給變數"以整數為引數的函式"
>>>print(以整數為引數的函式) # 將變數列印出來
<function 判斷奇偶數 at 0x1076e2510>
>>>以整數為引數的函式(9)
False
從執行結果來看,在執行時建立函式,並把函式賦值給變數沒有問題,而且被賦值之後的變數“以整數為引數的函式”就是一個可以被執行的函式了。
第三條,能作為引數傳給函式
要實現這點,我們首先得構造一個引數是函式的函式
>>> def 第一個引數是函式的函式(函式, 數值):
... return 函式(數值)
...
>>>
然後把前面定義的函式“判斷奇偶數”當做引數傳遞給“第一個引數是函式的函式”
>>>第一個引數是函式的函式(判斷奇偶數,10)
True
>>>第一個引數是函式的函式(以整數為引數的函式, 9) # 我們也可以把 變數“以整數為引數的函式”當引數
False
看來,以“函式”做為“函式的引數”也沒有什麼問題,雖然說起來有點拗口?。
第四條:能作為函式的返回結果
同上,要實現這一點,我們要構造一個“以函式為返回值的函式”
>>>def 以函式為返回值的函式(函式):
... return 函式
...
>>>以函式為返回值的函式(判斷奇偶數)(6) # “以函式為返回值的函式”返回了“判斷奇偶數”
True
我們可以再構造一個有兩個引數的函式試試
>>>def 有兩個引數的函式(引數1, 引數2):
... return 引數1 > 引數2
...
>>>以函式為返回值的函式(有兩個引數的函式)(100, 101)
False
也沒有問題!
從上面的例子我們可以看到Python作為一門指令碼語言的簡練和易用之處。
當然,有時候也會出些問題,比如,引數不滿足要求
>>> 第一個引數是函式的函式(有兩個引數的函式,10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in 第一個引數是函式的函式
TypeError: 有兩個引數的函式() missing 1 required positional argument: '引數2'
這種時候,我們就要小心謹慎一些咯?♀️
寫成有註解的函式有可能會給我們提個醒 ——
def 有註解的函式(文字:str, 長度:int)->str:
... return 文字[:長度].rstrip()
>>> 有註解的函式("abcdefghijklmn",5)
'abcde'
函式註解的最大影響 ... 是為 IDE 和 lint 程式等工具中的靜態型別檢查功能提供額外的型別資訊。 —— 《流暢的Python》 P132
前述這些只是讓我們學習Python函數語言程式設計簡單瞭解一點概念,Python函數語言程式設計 可以玩出很多的花樣來。 讓我們期待這本 《Functional Python Programming, Second Edition》中文版早日出版吧!
相關文章
- python技巧 一等函式Python函式
- 關於建構函式的一點理解函式
- javascript一等公民------函式JavaScript函式
- Python學習之路24-一等函式Python函式
- JavaScript世界的一等公民 - 函式JavaScript函式
- Python函式每日一講 - help函式的使用與實踐Python函式
- 關於rand和srand函式使用的一點心得函式
- 再談函式和一等公民函式
- Python學習之路25-使用一等函式實現設計模式Python函式設計模式
- JavaScipt中作為一等公民的函式Java函式
- Go函式介紹與一等公民Go函式
- python關於函式形參Python函式
- 關於python建構函式的過載Python函式
- 對於HOOK函式的一點認識Hook函式
- 基於 GraphQL 實踐的一點思考
- 關於類的建構函式不能為虛擬函式的幾點理由!函式
- python 關於 函式物件與閉包Python函式物件
- 對於HOOK函式的一點認識 (轉)Hook函式
- 流暢的python讀書筆記-第六章-使用一等函式實現設計模式Python筆記函式設計模式
- 前端亂彈99日之函式是一等公民前端函式
- 關於 Math.random 的一些函式random函式
- 關於虛擬函式的一些理解函式
- 關於count函式的理解函式
- 關於lag函式的用法函式
- 基於函式index的一點簡單測試!函式Index
- 工程實踐:給函式取一個"好"的名字函式
- 當函式成為一等公民時,設計模式的變化函式設計模式
- javascript關於Array()建構函式引數注意點JavaScript函式
- mysql練習 —— 關於一些函式的使用MySql函式
- Python 函式相關Python函式
- 關於scanf函式的問題函式
- 關於函式索引的問題?函式索引
- Oracle中關於函式的使用Oracle函式
- 關於qt中的tr()函式QT函式
- 關於Oracle取整的函式Oracle函式
- 關於建構函式與解構函式的分享函式
- 關於效能優化的一些實踐優化
- 關於C# Span的一些實踐C#