本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/96209
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)
贊 (0)
Python函數返回值、作用域以及樹的概念
上一篇
2018-04-15
sed命令應用
下一篇
2018-04-15