python——函數之生成器

1 生成器函數的含義

    生成器是一個返回能夠迭代對象的函數,它是一個特殊的迭代器,但迭代器的抽象層級更高且比較複雜須要實現不少方法。相較迭代器而言,生成器簡單使用。函數

2 生成器的建立方式

  2.1 生成器表達式

    把列表推導式的[] 修改成(),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異常提示。下次若是想繼續從新遍歷,必須先從新建立生成器。

相關文章
相關標籤/搜索