python——函數之生成器
阿新 • • 發佈:2018-08-12
ml2 一次 生成 狀態 提示 pan 使用 python 參數
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): 3print("列表的第%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 fori 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異常提示。下次如果想繼續重新遍歷,必須先重新創建生成器。
python——函數之生成器