使用send将值传递给yield

时间:2013-12-14 04:43:13

标签: python python-2.7 yield

当我在谷歌搜索python yield时,我发现了一些有趣的东西,我以前从未知道,即我们可以将值传递给yield来改变next()值。我希望一些新的pythonist现在可能会意识到这一点,我不确定它是如何工作的。所以,如果有任何正文可以解释它是如何工作的,以及当我使用send()发送新索引时,行为会如何变化。

以下是我的摘要:

def print_me (count):
    i = 0
    while i < count:
        val = (yield i)
        if val is not None:
            i = val
        else:
            i += 1

gen = print_me(10)

for i in gen:
   if i == 5:
       gen.send(8)
   else:
       print i

这是我的输出:

0
1
2
3
4
9

1 个答案:

答案 0 :(得分:4)

您的测试代码实际上很有启发性。在这样的生成器函数中发生的事情是,无论何时在生成器上调用next,代码都会执行,直到它到达yield语句。产生该值,然后在发生器中执行“暂停”。如果.send向生成器发送了一些数据,那么该值将从yield 返回。如果您没有.send任何内容,yield会返回None

因此,在您的代码中,当您.send(8)时,它会在您的生成器(val = 8)中设置val = yield i。自val is not None起,i设置为8。实际执行.send直到下一个yield语句(返回该值 - 8)。然后事情恢复正常(下一个要产生的数字是9)。