將物件傳送到生成器

除了從生成器接收值之外,還可以使用 send() 方法物件傳送到生成器。

def accumulator():
    total = 0
    value = None
    while True:
        # receive sent value
        value = yield total
        if value is None: break
        # aggregate values
        total += value

generator = accumulator()

# advance until the first "yield"
next(generator)      # 0

# from this point on, the generator aggregates values
generator.send(1)    # 1
generator.send(10)   # 11
generator.send(100)  # 111
# ...

# Calling next(generator) is equivalent to calling generator.send(None)
next(generator)      # StopIteration

這裡發生的是以下內容:

  • 當你第一次呼叫 next(generator) 時,程式前進到第一個 yield 語句,並返回 total 的值,該值為 0.生成器的執行在此時暫停。
  • 當你然後呼叫 generator.send(x) 時,直譯器接受引數 x 並使其成為最後一個 yield 語句的返回值,該語句被賦值給 value。然後發電機照常進行,直到它產生下一個值。
  • 當你最終呼叫 next(generator) 時,程式會將此視為將 None 傳送到生成器。None 沒有什麼特別之處,但是,這個例子使用 None 作為特殊值來要求發電機停止。