# 迭代與yield ## 目的 yield指令的主要目的,是為了**為了節省記憶體的使用**。 範例: ```python= 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)) ``` > **注意:** > > 兩邊是`()`,而不是中括號`[]`