Python遞歸函數、生成器以及匿名函數

Python遞歸函數、生成器以及匿名函數

函數的執行流程
遞歸Recursion
函數直接或者間接調用自身 就是遞歸
遞歸需要有邊界條件、遞歸前進段、遞歸返回段
遞歸一定要有邊界條件
當邊界條件不滿足的時候,遞歸前進
當邊界條件滿足的時候,遞歸返回
遞歸Recursion
遞歸的要求,
遞歸一定要有退出條件,遞歸調用一定要執行到這個退出條件,如果沒有退出條件,將會反復調用
遞歸調用的深度不宜過深
超出遞歸深度限制,會拋出RecursionError:maxinum? recursion depth exceeded
查看遞歸調用深度
sys.getrecursionlimit()
能不用遞歸則不用遞歸
Fibonacci number 實現遞歸三種方式
#菲薄那些數列實現遞歸
def fib(n):
????if n < 2:
????????return 1
????else:
????????return fib(n-1) + fib(n-2)

#d遞歸實現上面算法
def fib1(n,i=0,j=1):
????i,j = j,i+j
????print(j,end = ‘ ‘)
????if n == 0:
????????return
????fib1(n-1,i,j)

#for 循環實現斐波那偰數列
i = 0
j = 1
for z in range(9):
????i,j = j,i+j
????print(j,end = ” “)
匿名函數
Python借助lambda表達式構建匿名函數
格式:
? ? lambda 參數列表:表達式
? ? (lambda x:x ** 2)(4)
? ? 4是實參,x是定義函數的形參
? ? 相當于def _inc(x):
?? ??? ?? ?return x** 2
?? ?? ? _inc(4)
使用lambda關鍵字來定義匿名函數
參數列表不需要小括號
冒號是用來分割參數列表和表達式的
不需要使用return,表達式的值就是匿名函數的返回值
lambda表達式(匿名函數)只能寫在一行上,被稱為單行函數
[x for x in (lambda *args: map(lambda x: x+1, args))(*range(5))] #高階函數
[x for x in (lambda *args: map(lambda x: (x+1,args), args))(*range(5))]
生成器
生成器指的是生成器對象,可以由生成器表達式得到,也可以使用yield關鍵字得到一個生成器函數,調用這個函數得到一個生成器對象
生成器函數
? ? 函數體中包含yield語句的函數,返回生成器對象
? ? 生成器對象,是一個可迭代對象,是一個迭代器
? ? 生成器對象是延遲計算、惰性求值
生成器函數可以使用next函數多次執行
在生成器函數中,使用多個yield語句,執行一次后會暫停執行,把yield表達式的值返回
再次執行會執行到下一個yield語句
return語句依然可以終止函數運行,但return語句的返回值不能被獲取到
return會導致無法繼續取到下一個值,拋出StopIteration異常
如果函數沒有顯示的return語句,如果生成器執行到函數結尾,一樣會拋出StopIteration異常
生成器
生成器函數
? ? 包含yield語句的生成器函數生成 生成器對象的時候,生成器的函數的函數體不會立即執行的
? ? next(generator)會從函數的當前位置向后執行到第一個yield,會彈出值,暫停函數的執行
? ? 再次調用next函數,和上一條一樣的處理過程
? ? 沒有多余的yield語句能被執行,繼續調用next函數,會拋出StopIteration異常
計數器
def inc1():
????def counter1():
????????i = 0
????????while True:
????????????i += 1
????????????yield i
????d = counter1()
????return lambda :next(d)
生成器應用
協程 coroutine
實現調度
yield from
yield from iterable 是 for item in iterable:yield item形式的語法糖
從可迭代對象中一個個拿元素
def counter():
????for x in range(n):
????????yield x
def inc(n):
????yield from??counter(n)

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/96209

(0)
SignalSignal
上一篇 2018-04-15
下一篇 2018-04-15

相關推薦

  • PYTHON類型注解

    PYTHON類型注解 函數定義的弊端 Python是動態語言,變量隨時可以被賦值,且能賦值為不同的類型 Python不是靜態編譯型語言,變量類型是在運行器決定的 動態語言很靈活,但是這種特性也是弊端 def add(x, y):return x + yprint(add(4, 5))print(add(‘hello’, ‘…

    Python筆記 2018-05-02
  • 面向對象之魔術方法

    特殊屬性 屬性 含義 __name__ 類、函數、方法的名稱 __module__ 類定義所在的模塊名 __class__ 對象或類所屬的類 __bases__ 類的基類的元組,順序為它們在基類列表中出現的順序 __doc__ 類、函數的文檔字符串,若沒定義則為None __mro__ 類的mro,方法查找順序 __dict__ 類或實例的屬性,可寫的字典 …

    2018-05-20
  • Python面向對象基礎

    語言分類 面向機器 抽象成機器指令,讓機器容易理解 代表:匯編語言 面向過程 按照步驟一步一步走,若出現情況A做相應的處理,若出現情況B做相應的處理 問題規模小,可以步驟化,按部就班處理 代表:C 面向對象OOP 計算機需要處理的問題的規模越來越大,需要多人、多部門協作 代表:C++、Java、Python 面向對象 一種認識世界、分析世界的方法論。將萬事萬…

    2018-05-06
  • Python內置數據結構——列表

    知識框架圖 學習筆記 數據結構分類 數值 int、float、complex、bool都是class int:長整型,沒有上限,取決于內存區域大小 float:支持十進制和科學計數法,僅支持雙精度 complex:復數,有實數和虛數部分 bool:int的子類,True、False對應1、0,可以和整數直接運算 序列對象 字符串str 列表list 元組tu…

    2018-03-26
  • Python高階函數及裝飾器

    First Class Object 函數在Python中是一等公民 函數也是對象,可調用的對象 函數可作為普通變量、參數、返回值等 高階函數 數學定義:y=g(f(x)) 高階函數需滿足的條件,至少其一 接受一個或多個函數作為參數 輸出一個函數 內建函數的高階函數 排序:sorted(iterable[,key][,reverse]) 返回一個新列表,對一…

    2018-04-22
  • 序列化 Json MessagePack

    序列化 反序列化 pickle模塊
    Json 模塊
    MessagePack

    2018-05-02
欧美性久久久久