我正在阅读以下关于Python中的生成器的教程 http://excess.org/article/2013/02/itergen2/
它包含以下代码:
def running_avg():
"coroutine that accepts numbers and yields their running average"
total = float((yield))
count = 1
while True:
i = yield total / count
count += 1
total += i
我不明白float((yield))
的含义。我以为yield
用于从生成器“返回”一个值。这是yield
的不同用法吗?
答案 0 :(得分:3)
它是协程的扩展yield
语法
答案 1 :(得分:2)
是的,yield
也可以接收,通过发送到生成器:
>>> avg_gen = running_avg()
>>> next(avg_gen) # prime the generator
>>> avg_gen.send(1.0)
1.0
>>> print avg_gen.send(2.0)
1.5
传递给generator.send()
method的任何值都由yield
表达式返回。请参阅yield
expressions文档。
yield
在Python 2.5中成为表达式;之前它只是一个声明,只生成了发电机的值。通过使yield
表达式并添加.send()
(以及其他方法来发送异常),生成器现在可以用作简单coroutines;请参阅PEP 342了解此更改的初步动机。