python基础(part17)--函数式编程
鄙人學習筆記
開發工具:Spyder
文章目錄
- 函數式編程
- 舉個例子1
- 舉個例子2
- 舉個例子3
- 函數作為參數
- lambda表達式
- 舉個例子1
- 內置高階函數
- filter
- map
- sorted
- max
- 函數作為返回值
函數式編程
- 定義
函數式編程可以用一系列函數解決問題。
- 說明
①函數可以賦值給變量,賦值后變量綁定函數。
②允許將函數作為參數傳入另一個函數。
③允許函數返回一個函數。
- 高階函數
高階函數是將函數作為參數或返回值的函數
舉個例子1
看下面這段代碼:
def fun01():print("fun01執行")#將fun01方法賦值給變量a(并沒有執行fun01) a = fun01結果:
由以上代碼和結果可知,當我們把fun01直接賦值給a時,方法fun01不執行,且變量a得到了方法fun01的地址。
為了驗證一下我們所說的言論,我們調用一下變量a, 間接執行函數fun01:
def fun01():print("fun01執行")#將fun01方法賦值給變量a(并沒有執行fun01) a = fun01a()結果:
舉個例子2
看下面這段代碼:
def fun01():print("fun01執行")def fun02(func):print("fun02執行")func()我們看到函數fun02有一個參數func, 這個參數可以被調用。對于fun02的定義者而言,并不需要知道func的具體邏輯是什么。
我們將fun01作為方法fun02的參數func進行傳遞:
結果:
舉個例子3
我有下面這個列表:
我們有很多需求,現在,我們寫出一些方法來處理這些需求:
這時,我們發現大量代碼是重復的,只不過有些if條件不一樣。對于相同的代碼,我們要提取; 對于不同的代碼,我們要封裝。
首先,我們提取相同點:
我們再提取不同點:
現在,我們要將不同點”封裝”起來,即將不同點提取到方法中:
我們再將相同點,設計成一個可以將我們的條件函數conditionXX作為參數傳入的方法:
備注:函數式編程的這種思想,也影射出了面向對象的分而治之的思想。
運行一下代碼:
結果:
函數作為參數
lambda表達式
- 定義
lambda表達式是一種匿名方法。
- 作用
①lambda表達式作為參數傳遞時,語法簡潔,優雅,代碼可讀性強。
②lambda表達式可隨時創建和銷毀,減少程序耦合度。
- 語法
定義lambda表達式:
變量 = lambda 形參:方法體調用lambda表達式:
變量(實參)- 說明
①形參沒有可以不填
②方法體只能有一條語句,且不支持賦值語句。
舉個例子1
首先我們寫幾個函數,并把它們分別改為lambda表達式:
①不帶參數
代碼:
我們再分別調用a01變量和fun01()方法,如下:
結果:
②帶參數
我們先看一下lambda表達式的語法:
備注:方法體只能有一個,但參數可以有多個
代碼:
我們再分別調用a02變量和fun02()方法,如下:
結果:
③有返回值
代碼:
我們再分別調用a03變量和fun03()方法,如下:
結果:
為什么要改寫成lambda表達式?
原因就是,lambda表達式,沒有名字(所以我們有時候也稱其為匿名方法)它可以使我們的程序更加簡潔;且,當我們只想把一個方法作為參數進行傳遞,但是不希望直接調用這個方法時(這個方法活著的價值就是傳參),我們就可以用lambda表達式。
最后備注:如果我們看見一大段相似的代碼,但是其中的計算方式(算法)不一樣。我們就應該將算法提取出去(lambda表達式),將共性保留下來(保留成靜態函數)。
內置高階函數
高階函數,即將函數作為參數或返回值的函數。
對于一些內置的高階函數,在下面的筆記中,每一個內置高階函數我都舉個例子,大概就能明白了,不明白,請自行看文檔/百度。
filter
- 舉個例子
先定義Enemy類和創建Enemy對象列表(這些class和列表在下面的內置高階函數的例子中也會用到):
過濾:
結果:
map
- 舉個例子
映射:
結果:
sorted
- 舉個例子
①降序排序(需要用變量接收返回值)
結果:
②升序排序(需要用變量接收返回值)
結果:
max
- 舉個例子
最大值:
結果:
函數作為返回值
未完待續,暫時不想寫了。
總結
以上是生活随笔為你收集整理的python基础(part17)--函数式编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSOL近身武器双持狂花乱舞专业文字视频
- 下一篇: 带增的网名76个