1. 程式人生 > >(D11)Python-函數語言程式設計,遞迴,閉包

(D11)Python-函數語言程式設計,遞迴,閉包

函數語言程式設計


函數語言程式設計

  • 函數語言程式設計是指用一系列函式解決問題
  • 函式是一等公民

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

函式的可重入性:

  • 當一個函式輸入的實參一定,結果也必須一定的函式稱為可重入函式
    • 說明:
      -可重入函式在函式內部一定不訪問除區域性變數以外的變數

示例:

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

高階函式:

  • (High Order Function)
  • map filter sorted

什麼是高階函式

  • 滿足以下條件中一個的函式即為高階函式
    • 函式接受一個或多個函式作為引數傳入
    • 函式返回一個函式
  • map 函式
    • map(func,*iterable),返回一個可迭代物件,此可迭代物件用函式func對可迭代物件iterable中的每一個元素作用引數計算後得一個結果,當最短的一個可迭代物件不再提供資料時刻碟大愛物件生成資料結束

示例:

    def power2(x):
        return x ** 2
    # 生成一個可迭代物件,此可迭代物件可以生成1~9的
    # 整數的平方
    for x in map(power2, range(1, 10)):
        print(x)
    # 生成一個可迭代物件, 此可迭代物件可以生成:
      1**4, 2**3, 3**2, 4**1
      
    def mypower2(x, y):
        return x ** y

    for x in map(mypower2,[1,2,3,4],[4,3,2,1]):
        print(x)
  • filter函式:
    • filter (function,iterable) 返回一個可迭代物件此可迭代物件將iterable提供的資料用函式進行篩選,function將對iterable中的每個元素求值。返回False 將此資料丟棄,返回True則保留
  • 示例:
    def isodd(x):
       return x % 2 == 1
    # 列印0~10之間所有的奇數:
    for x in filter(isodd, range(11)):
        print(x)
    for x in filter(lambda x:x%2, range(11)):
        print(x)
    
    L = [x for x in filter(isodd, range(11))]
  • sorted函式
    • 作用:
      • 將原可迭代物件提供的資料進行排序,生成排序後的列表
    • 格式說明:
      • sorted(iterable ,key=None,reverse=False)
      • 返回一個新的保安汗啊所有可迭代啊物件中的列表,新的列表是排序過來的列表。
    • 引數說明:
      • iterable 可迭代物件
      • key 函式是用來提供一個值,這個值作用排序的依據
      • reverse 是否降序排列

示例:

    L = [5, -2, -4, 0, 3, 1]  
    L2 = sorted(L)  # L2=[-4, -2, 0, 1, 3, 5]
    L3 = sorted(L, reverse=True)  # 從大到小排序

    L4 = sorted(L, key=abs)  # L4=[0, 1, -2, 3, -4, 5]
                             # 依據 0, 1,  2, 3,  4, 5

    names = ['Tom', 'Jerry', 'Spike', 'Tyke']
    sorted(names)  # ['Jerry', 'Spike', 'Tom', 'Tyke']
    sorted(names, key=len)
    sorted(names, key=len, reverse=True)

遞迴函式

  • 函式直接或者間接呼叫自身

示例:

    # 函式直接呼叫自身
    def f():
        f()  # 呼叫自己
    f()
    # 函式間接呼叫自身
    def fa():
        fb()
    
    def fb():
        fa()

    fa()

遞迴說明:

  • 遞迴一定要控制遞迴的層數,當符合某一條件事要終止遞迴呼叫幾乎所有的遞迴都能用while
  • 遞迴的優缺點:
    • 優點:可以把問題簡單化,讓思路更為清晰,程式碼簡潔
    • 缺點:遞迴因系統環境影響大,遞迴深度太大可能得不到預知的結果。
  • 遞迴函式的執行分為兩個階段:
    • 遞推階段:呼叫函式的內部
    • 迴歸階段:返回結果,得到最終的結果

閉包 clusure

  • 什麼是閉包?
    • 閉包是指用了此函式外部變數的函式(外部變數是指外部巢狀函式作用域內的變數)
    • 閉包必須滿足的三個條件:
      • 必須有一個巢狀函式
      • 內嵌函式必須引用外部函式中的變數
      • 外部函式返回值必須是內部巢狀函式
    • 注意點:
      • 由於閉包會使函式中的變數都被保留在記憶體中,記憶體消耗比較大,座椅不能濫用閉包

示例:

閉包測試題:
  試看下列程式的執行結果是什麼?
  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