函數式編程是指用一系列函數解決問題
好處:用每一個函數完成每一個細小的功能,一系列函數任意組合可以解決大問題
函數僅僅接收輸入併產生輸出,不包含任何能影響輸出的內部狀態python
當一個函數的輸入實參必定,結果也必須必定的函數爲可重入函數
例子:編程
#可重入函數 def myadd(x,y): return x+y #不可重入函數 s = 0 def myadd2(x,y): global s s+= x+y return s
什麼是高階函數閉包
知足下列條件中個任意一個的函數就是高階函數app
條件一:函數接收一個或多個函數中用參數傳入函數式編程
條件二:函數返回一個函數函數
map(func,*iterable)測試
map()是 Python 內置的高階函數,它接收一個函數 f 和一個 list,並經過把函數 f 依次做用在 list 的每一個元素上,獲得一個新的 list 並返回code
例子:對象
對於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)
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(iterable,key=None,reverse=False)
返回一個新的包含全部可迭代對象中數據的列表,新的列表是排序過的列表
參數說明:
示例:
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