将对象发送到生成器

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