將物件傳送到生成器
除了從生成器接收值之外,還可以使用 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
作為特殊值來要求發電機停止。