Python生成器 - float((yield))?

时间:2013-08-17 08:33:50

标签: python generator yield

我正在阅读以下关于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的不同用法吗?

2 个答案:

答案 0 :(得分:3)

它是协程的扩展yield语法

阅读本文: http://www.python.org/dev/peps/pep-0342/

答案 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了解此更改的初步动机。