Python yield:生成器的威力與實戰應用
1. yield 就是「可中斷的 return」 直覺上, yield 看起來很像 return :遇到它就「回傳」一個值;不同的是,函式不會結束,而是暫停在此,保留當前所有區域變數與執行位置,等到下一次呼叫才會從暫停處繼續執行。 簡單來說: def foo (): print ( "開始執行" ) while True : yield 4 # 暫停並回傳 4 print ( "★ 繼續執行 ★" ) 第一次執行 g = foo() 不會執行函式內容 ,而只回傳一個生成器物件。 呼叫 next(g) ,才會印出 "開始執行" ,並暫停在 yield 4 回傳 4 。 再呼叫一次 next(g) ,將從 yield 之後的位置繼續執行,印出 ★ 繼續執行 ★ ,然後再次遇到 yield 4 暫停並回傳。 2. next() 如何推動生成器 生成器物件除了可以被 next() 觸發,也可搭配迴圈自動驅動: g = foo() print ( next (g)) # → 4 print ( next (g)) # → ★ 繼續執行 ★ 4 for v in foo(): print (v) # 不停印出 4,直到你手動 break next(g) 等同於「進到下一個 yield 」,每次都從函式暫停處繼續執行。 用 for 迴圈時,Python 會自動呼叫 next() 直到生成器遇到 return 或拋出 StopIteration 。 3. 用 send() 向生成器傳入資料 除了單純取得值,生成器還能接收外部傳入的資料──使用 send() : def foo2 (): print ( "啟動" ) while True : received = yield "請傳入值" print ( "收到的值:" , received) g2 = foo2() print ( next (g2)) # 啟動,回傳 ...