1、生成器函數
1.概念spa
在Python中, 一邊循環一邊計算的機制, 稱爲生成器: generator code
建立生成器: G = ( x*2 for x in range(5)) 協程
能夠經過 next(生成器) 函數得到生成器的下一個返回值 對象
沒有更多的元素時, 拋出 StopIteration 的異常 blog
生成器也能夠使for 循環,由於生成器也是可迭代對象 generator
2.生成器1 生成的第一種方式 it
list2 = [x for x in rang(10)] print(type(list2)) #獲得一個生成器對象 g = (x*2 for x in rang(10)) print(type(g)) #打印生成器生成第一個數字 peint(next(g)) peint(next(g)) peint(next(g)) 一共10個數字,打印超出報StopIteration異常
3.生成器io
3.1使用循環求斐波那契數列的第n個數for循環
def feibo(items): a, b, n = 1, 1, 3 while n <=items: if items == 1 or items ==2: return 1 else: a, b =b, a +b print(b,end=" ") n += 1 return b feibo(4)
3.2生成器的第二種生成方式 yield
函數中只要有yield關鍵字,這個函數就變成了生成器
def fibo(n): a = 1 b = 1 i = 3 if n == 1 or n == 2: return 1 while i <= n: a, b = b, a + b i += 1 # 協程 讓函數變成了生成器 至關於循環的暫停 yield b return b # 獲得生成器對象 v = fibo(10) # 用生成器的方式打印出來 print(next(v)) # 使用for循環遍歷生成器 for x in v: print(x,end="\t")
3.3 生成器 send()的用法 必須有一個參數
def test(): i = 0 while i < 5: #賦值運算下次會被執行 yield會使程序停住 temp = yield i print(temp) i += 1 g = test() print("-----send----") print(g.__next__()) print(next(g)) print(g.send("aaa")) 運行結果: -----send--- 0 None 1 aaa 2
3.4 首次調用send()異常問題
解決方案:
1.首次調用使用__next__(),不使用send()
2.或者首次使用send(None)
def test(): i = 0 while i < 5: temp = yield i print(temp) i += 1 g = test() print("-----send----") # 首次調用不傳參或者傳遞非None參數都會致使異常 print(g.send()) print(g.send("aaa"))