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