1. 程式人生 > >yield 生成器

yield 生成器

rec 實例化 trac -- int 如果 color 調用函數 pre

如下,如果沒有生成器 yield ,那麽我們執行函數的時候會 print 出來,但是如果我們不想打印出來呢,我們只是想先調用函數,等到指定的時刻再讓它執行函數裏的語句,我們可以使用生成器,當我們執行生成器的 next() 方法時,會執行 yield 1 上面的語句,這時就會打印出 abc ;當我們再執行 next() 方法時,會執行 yield 2 上面的語句打印出 def ,以此類推,這樣,我們就能隨時控制什麽時候執行什麽語句,這就是生成器的作用

In [6]: def fun():
   ...:     print abc
   ...:     yield 1
   ...:     print 
def ...: yield 2 ...: print ghi ...: yield 3 ...: In [7]: fun() # 因為有 yield 所以產生的是一個生成器對象 Out[7]: <generator object fun at 0x21223c0> In [8]: a = fun() # 我們進行實例化 In [9]: a.next() # 當我們執行生成器的 next() 方法時,會執行 yield 1 上面的語句,這時就會返回 abc 並打印出 yield 後面指定的 1
abc Out[
9]: 1 In [10]: a.next() # 當我們再執行 next() 方法時,就從上次中斷的地方繼續執行語句,這時就會返回 def 並打印出 yield 後面指定的 2 def Out[10]: 2 In [11]: a.next() ghi
Out[11]: 3 In [
12]: a.next() # 當所有語句執行完之後就為空了,再繼續執行就會報錯 --------------------------------------------------------------------------- StopIteration Traceback (most recent call last)
<ipython-input-12-aa817a57a973> in <module>() ----> 1 a.next() StopIteration: In [13]: a = fun() # 我們也可以通過 for 循環的方法來遍歷執行函數內的語句 In [14]: for i in a: ....: print i ....: abc 1 def 2 ghi 3

yield 生成器