迭代與yield

目的

yield指令的主要目的,是為了為了節省記憶體的使用

範例:

def foo(): print('start...') a = yield 1 print(a) b = yield 2 print(b) c = yield 3 print(c) y = foo() print('next:', next(y)) print('send:', y.send('y')) print('next:', next(y))
輸出如下:
start...
next: 1
y
send: 2
None
next: 3
說明:
  1. 程式開始執行後,因為函式 foo 裡有 yield,因此程式並不會直接運行,而是轉換成生成器(Generator)。
  2. 直到遇到next() 函式(或是使用了 while、for 迴圈等),foo函式程式就會開始執行,因此出現了start…。
  3. 到了a = yield 1後因為遇到yield,所以此時foo()函式會丟出1,且暫停執行,此時畫面會出現: next: 1
  4. 接著遇到了y.send('y'),因此a = yield 1會收到字串y,因此print(a)會印出y。
  5. 接下來當遇到yield 2時,foo()函式又會暫停執行,並丟出2,因此會出現send: 2
  6. 接著再往下遇到next(y),此時b=yield會繼續執行,但是b不會收到任何資料,因此print(b)會出現None
  7. 接著再遇到c = yield 3,因此foo()函式會丟出3,會出現next: 3

for-in

Generator可以使用在for-in迴圈上,for-in迴圈會自動呼叫next()函式來對著產生器不斷執行,直到最後一個yield丟出資料,便結束了。

Generator只能被使用一次,因此當執行結束後,再次呼叫next()就不會再拿到任何資料了。

產生生成器

使用下面方式也可以建立生成器:

a = (x*x for i in range(10))

注意:

兩邊是(),而不是中括號[]