Python 使用send将值传递给yield
当我在谷歌上搜索pythonPython 使用send将值传递给yield,python,python-2.7,yield,Python,Python 2.7,Yield,当我在谷歌上搜索pythonyield时,我发现了一些有趣的事情,我以前从未知道过,也就是说,我们可以将值传递给yield来更改下一个()值。我希望一些新的pythonist可能现在意识到这一点,我也不知道它是如何工作的。因此,如果有人能解释它是如何工作的,以及当我使用send()发送一个新的索引时行为是如何变化的 以下是我的片段: def print_me (count): i = 0 while i < count: val = (yield i)
yield
时,我发现了一些有趣的事情,我以前从未知道过,也就是说,我们可以将值传递给yield来更改下一个()值。我希望一些新的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
你的测试代码实际上很有启发性。在这样的生成器函数中,无论何时调用生成器上的
next
,代码都会被执行,直到到达yield
语句。生成值,然后在生成器中执行“暂停”。如果将一些数据发送到生成器,则该值将从yield
返回。如果您不.send
任何内容,yield
返回None
因此,在代码中,当您
.send(8)
时,它会在生成器中设置val=8
(val=yield i
)。由于val不是None
,i
被设置为8
.send
实际执行,直到下一个yield语句(返回该值--8
)为止。然后一切恢复正常(下一个数字是9
)。你的问题是什么?你不了解哪一部分的行为?当我发送一个新的索引时,屈服点是如何指向新的索引的。基本上我很困惑yield
是在使用某种链表还是?我不太明白你所说的“新索引的屈服点”是什么意思。使用send
时,所发送的值将成为yield
表达式的值。如何在生成器中使用它取决于您。这个“增强”的生成器语法是在Python2.5中添加的,用于构建协同路由。这里有一些有趣的相关信息:需要注意的一件重要事情是send
推进生成器(即,运行它直到下一个yield
并给出下一个值)。这有时会让人困惑。@BrenBarn--谢谢,这是真的(我总是需要查一下)。我已经澄清了答案。谢谢你@BrenBarn和mgilson。我想现在我明白了。这种先进的产量有什么使用案例吗?我什么也看不到。@yopy——协同程序。我自己也没有用过,所以我不能给你一个好的用例。看看roippi发布的PEP中的合作计划和信息。
0
1
2
3
4
9