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

留言

熱門文章