1. 程式人生 > >python——函數之生成器

python——函數之生成器

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):
 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異常提示。下次如果想繼續重新遍歷,必須先重新創建生成器。

python——函數之生成器