標籤:區別 bsp turn range 對象 分享圖片 bubuko back []
1 產生器函數的含義
產生器是一個返回可以迭代對象的函數,它是一個特殊的迭代器,但迭代器的抽象層級更高且比較複雜需要實現很多方法。相較迭代器而言,產生器簡單使用。
2 產生器的建立方式 2.1 產生器運算式
把列表推導式的[] 修改為(),如
(i for i in range(1, 10000) if i % 2 == 0)
代碼執行介面如下:
2.2 產生器函數
(1)在一個一般函數中使用yield關鍵字,可以實現一個最簡單的產生器,此時這個函數變成一個產生器函數。簡單來說,產生器函數就是函數
中包含 yield語句的函數。
yield文法:yield [傳回值] ([] 表示選擇性參數)。
yield的作用:yield可以去阻斷當前的函數執行。當使用next()(或.__next__())函數,會讓函數繼續執行,yield後面的值作為next()函數
傳回值,當執行到下一個 yeild時,又會被暫停掛起。
yield與return的區別:yield會儲存當前函數的執行狀態,在返回後,函數又回到之前儲存的狀態繼續執行;而return返回後,函數
狀態終止。
(2)代碼執行個體
1 def mylist(): 2 for i in range(3): 3 print("列表的第%s個元素:" % i, end="") 4 yield i 5 6 7 ml = mylist() # 建立一個產生器 8 print(next(ml)) 9 print(next(ml))10 print(next(ml))11 print(next(ml)) # 當產生器遍曆完後,再遍曆就會報錯
代碼執行順序:
3 產生器的遍曆
3.1 next()或.__next__()遍曆,代碼如下
1 # 方式1 2 ml = (i for i in range(1, 10) if i % 2 == 0) 3 print("next()方式遍曆結果:", end="") 4 print(ml.__next__(), end=" ,") 5 print(ml.__next__(), end=" ,") 6 print(ml.__next__(), end=" ,") 7 print(ml.__next__()) 8 9 # 方式210 ml2 = (i for i in range(1, 10) if i % 2 == 0)11 print(".__next__()方式遍曆結果:", end="")12 print(next(ml2), end=" ,") # next()相當於 產生器.__next__()13 print(next(ml2), end=" ,")14 print(next(ml2), end=" ,")15 print(next(ml2))
上面代碼執行結果如下:
3.2 for in方式遍曆,代碼如下,
1 ml = (i for i in range(1, 10) if i % 2 == 0)2 print("for in 遍曆結果為;", end=" ")3 for i in ml:4 print(i, end=", ")
上面代碼執行結果為:
4 關閉產生器
命令:產生器名稱.close() ,例如 ml.close()。
注意:產生器只會遍曆一次,當關閉產生器或者遍曆一遍後,後續如果再調用,會拋出StopIteration異常提示。下次如果想繼續重新遍曆,必須先重新建立產生器。
python——函數之產生器