当我在谷歌搜索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
答案 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
)。