Python開發【第十三篇】高階函數、遞歸函數、閉包
- 2019 年 11 月 13 日
- 筆記
函數式編程是指用一系列函數解決問題
好處:用每個函數完成每個細小的功能,一系列函數任意組合能夠解決大問題
函數僅僅接收輸入併產生輸出,不包含任何能影響輸出的內部狀態
函數之間的可重入性
當一個函數的輸入實參一定,結果也必須一定的函數為可重入函數
例子:
#可重入函數 def myadd(x,y): return x+y #不可重入函數 s = 0 def myadd2(x,y): global s s+= x+y return s
高階函數
- map
- filter
- sorted
什麼是高階函數
滿足下列條件中個任意一個的函數就是高階函數
條件一:函數接收一個或多個函數中用參數傳入
條件二:函數返回一個函數
map函數
map(func,*iterable)
map()是 Python 內置的高階函數,它接收一個函數 f 和一個 list,並通過把函數 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回
例子:
對於list[1,2,3,4,5,6,7,8,9]
如果希望把list的每個元素都做平方,就可以用map()函數
因此,我們只需要傳入函數f(x)==x*x,就可以利用mnap()函數完成這個計算
def f(x): return x*x print(map(f,[1,2,3,4,5,6,7,8,9])) 輸出結果: [1.4.9.10.25.36.49.64.81] 注意:map函數是不改變原有的list的,而是生成一個新的list
map()函數是python內置的高階函數,對傳入的list的每一個元素進行映射,返回一個新的映射之後的list
python3中,map函數返回的是一個map對象,需要list(map(fun,itor))來將映射之後的map對象轉換成列表
map(func, *iterable) 返回一個可迭代對象,此可迭代
對象用函數 func對可迭代對象iterable中的每一個
元素作用參數計算後得一結果,當最短的一個可迭代對
象不再提供數據時可迭代對象生成數據結束
def mypower2(x, y): return x ** y for x in map(mypower2,[1,2,3,4],[4,3,2,1]): print(x) # 看懂下面程序在做什麼: for x in map(pow, [1,2,3,4], [4,3,2,1], range(5, 10)): print(x)
filtert函數
filter(function,iterable)返回一個可迭代對象
此可迭代對象將iterable提供的數據用函數function進行篩選
function將對iterable中的每個元素求值
返回False將此數據丟棄,返回True則保留
示例:
def isood(x): return x % 2 == 1
打印0~10之間的所有奇數
for x in filter(isood,range(11)): print(X) for x in filter(lambda x:x%2,range(11)): print(X) L = [x for x in filter(isood,range(11))]
sorted函數
作用:
將原可迭代對象提供的數據進行排序,生成排序後的列表
格式說明:
sorted(iterable,key=None,reverse=False)
返回一個新的包含所有可迭代對象中數據的列表,新的列表是排序過的列表
參數說明:
- iterable —–>可迭代對象
- key———>函數是用來提供一個值,這個值將作為排序的依據
- reverse—–>標誌用來設置是否降序排序(默認為升序)
示例:
L = [5,-2,-4,0,3,1] L2 = sorted(L) k3 = sorted(L,keys=abs) names= ['Tom','Jerry','Spike','Tyke'] sorted(names) sorted(names,key=len,reverse=True)
遞歸函數
什麼叫遞歸函數?
函數直接或者間接的調用自身
示例:
#函數直接調用自身 def f(): f()#調用自己 #函數間接調用自身 def fa(): fb() def fb(): fa() fa()
遞歸說明:
-
遞歸一定要充值遞歸的成熟,當符合某一條件時要終止遞歸調用,幾乎所有的遞歸都能用while循環來代替
優點:遞歸可以把問題簡單化,讓思路清晰,代碼簡潔
缺點:遞歸因系統環境影響大,當遞歸深度太大時,可以得到不可預知的結果
-
遞歸函數的執行分為兩個階段
-
遞推階段:調用進入函數內部
-
回歸階段:返回結果,得到最終結果
閉包
什麼是閉包?
- 閉包是指引用了次函數外部變量的函數
- (外部變量指:外部嵌套函數作用域內的變量)
閉包必須滿足三個條件
- 必須有一個內嵌函數
- 內嵌函數必須引用外部函數的變量
- 外部函數返回值 必須為內嵌函數
注意:
由於閉包會使函數中的變量都保存在內存中,計算機的內存消耗比較大,所以不能濫用閉包
示例
# 此示例示意閉包的定義及調用 def make_power(y): def fn(x): # fn綁定一個閉包函數 return x ** y return fn pow2 = make_power(2) # pow2綁定一個閉包函數 print("5的平方是:", pow2(5)) pow3 = make_power(3) print("6的立方是:", pow3(6)) fp = make_power(100) fp = make_power(10000)
閉包測試題:
試看下列程序的執行結果是什麼?
def get_funs(n): L = [] for i in range(n): L.append(lambda x: x * i) return L funs = get_funs(4) print(funs[0](10)) # 30 print(funs[1](10)) # 30 print(funs[2](10)) # 30 print(funs[3](10)) # 30


