Python - yield 產生器
1. yield 的基本用法:
yield 最簡單的用法就是函式會先記住原本的執行狀態,回傳結果並將控制權交給主程序。
下面程式執行到 yield x 時會回傳 x 的值。
def stepper(max_iter=10): x = 0 while x < max_iter: yield x x += 1
呼叫 stepper() 並不會執行上面的函式而是會先產生一個 generator,然後我們要再執行 generator 的 __next__ 方法。
s = stepper() # 生成 generator print(next(s)) # 0 print(s.__next__()) # 從 yield 狀態繼續執行,回傳 1
我們可以透過 for...in 的方式呼叫 generator 的 __next__ 方法。
當 generator 無法 yield 的時候會拋出 StopIteration 例外,告訴 for...in 迴圈不用再迭代。
for step in stepper(max_iter=10): print(step) # 0-9
2. 利用 yield 接收 input:
我們可以建立一個簡單的 producer-consumer 架構如下:
def producer(): data = 0 while True: data += 1 print(f"Producer prroduce: {data}") yield data def consumer(): while True: data = yield print(f"Consumer receive: {data}")
產生 generator。
p = producer() c = consumer()
啟動 producer-consumer,consumer 必須先執行到 yield
next(c) for _ in range(5): data = next(p) # 產生 data c.send(data) # 輸入 data
留言
張貼留言