将对象发送到生成器
除了从生成器接收值之外,还可以使用 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
作为特殊值来要求发电机停止。