生成器是一個返回能夠迭代對象的函數,它是一個特殊的迭代器,但迭代器的抽象層級更高且比較複雜須要實現不少方法。相較迭代器而言,生成器簡單使用。函數
把列表推導式的[] 修改成(),如spa
(i for i in range(1, 10000) if i % 2 == 0)
代碼執行界面以下:3d
2.2 生成器函數code
(1)在一個通常函數中使用yield關鍵字,能夠實現一個最簡單的生成器,此時這個函數變成一個生成器函數。簡單來講,生成器函數就是函數對象
中包含 yield語句的函數。blog
yield語法:yield [返回值] ([] 表示可選參數)。io
yield的做用:yield能夠去阻斷當前的函數執行。當使用next()(或.__next__())函數,會讓函數繼續執行,yield後面的值做爲next()函數class
返回值,當執行到下一個 yeild時,又會被暫停掛起。遍歷
yield與return的區別:yield會保存當前函數的執行狀態,在返回後,函數又回到以前保存的狀態繼續執行;而return返回後,函數yield
狀態終止。
(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 # 方式2 10 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異常提示。下次若是想繼續從新遍歷,必須先從新建立生成器。