4

我正在阅读以下关于 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吗?

4

2 回答 2

3

它是协程的扩展yield语法

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

于 2013-08-17T08:41:11.643 回答
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()方法的任何值都由yield表达式返回。请参阅yield表达式文档。

yield在 Python 2.5 中做了一个表达式;在它只是一个语句并且只为生成器生成值之前。通过创建yield表达式并添加.send()(以及发送异常的其他方法),生成器现在可以用作简单的协程;有关此更改的最初动机,请参见PEP 342

于 2013-08-17T08:41:51.980 回答