Python開發【第十三篇】高階函數、遞歸函數、閉包

函數式編程是指用一系列函數解決問題
好處:用每一個函數完成每一個細小的功能,一系列函數任意組合可以解決大問題
函數僅僅接收輸入併產生輸出,不包含任何能影響輸出的內部狀態python

函數之間的可重入性

當一個函數的輸入實參必定,結果也必須必定的函數爲可重入函數

例子:編程

#可重入函數
def myadd(x,y):
    return x+y
#不可重入函數
s = 0
def myadd2(x,y):
    global s
    s+= x+y
    return s

高階函數

  • map
  • filter
  • sorted

什麼是高階函數閉包

​ 知足下列條件中個任意一個的函數就是高階函數app

​ 條件一:函數接收一個或多個函數中用參數傳入函數式編程

​ 條件二:函數返回一個函數函數

map函數

​ 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)

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
相關文章
相關標籤/搜索