關於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函式
- Python函式每日一講 - help函式的使用與實踐Python函式
- Python學習之路24-一等函式Python函式
- javascript一等公民------函式JavaScript函式
- Python學習之路25-使用一等函式實現設計模式Python函式設計模式
- python關於函式形參Python函式
- 再談函式和一等公民函式
- 關於python建構函式的過載Python函式
- Go函式介紹與一等公民Go函式
- python 關於 函式物件與閉包Python函式物件
- 基於 GraphQL 實踐的一點思考
- 流暢的python讀書筆記-第六章-使用一等函式實現設計模式Python筆記函式設計模式
- 關於count函式的理解函式
- 關於虛擬函式的一些理解函式
- 關於 Math.random 的一些函式random函式
- 前端亂彈99日之函式是一等公民前端函式
- 工程實踐:給函式取一個"好"的名字函式
- mysql練習 —— 關於一些函式的使用MySql函式
- 關於建構函式與解構函式的分享函式
- 關於函式指標函式指標
- Python中關於Thread的一點小知識Pythonthread
- python關於執行緒的一點介紹Python執行緒
- 關於效能優化的一些實踐優化
- 關於C# Span的一些實踐C#
- python生成器函式的特點Python函式
- Python - 函式實戰Python函式
- python函式每日一講 - int()函式Python函式
- PostgreSQL之SQL函式介紹及實踐(一)SQL函式
- Vue3組合式函式最佳實踐(一)Vue函式
- 函式計算實踐——一個應用案例函式
- 關於cuda中的函式問題函式
- 關於字串的功能函式小結字串函式
- Python之函式的相關介紹Python函式
- 使用函式式語言實踐DDD函式
- 字串相關函式的實現字串函式
- [iOS] [OC] 關於block回撥、高階函式“回撥再呼叫”及專案實踐iOSBloC函式
- 關於Python中math 和 decimal 模組的解析與實踐PythonDecimal
- 關於一篇文章引發的匿名函式的思考函式