Python - 了解生成器的发送功能

时间:2012-12-05 04:58:11

标签: python generator yield yield-keyword

我在Python yield学习,发现yield不仅是生成器输出返回值的方式,而且是将值放入生成器的方法。例如以下代码

def f():
    print (yield),
    print 0,
    print (yield),
    print 1

g = f()
g.send(None)
g.send('x')
g.send('y')

在全球范围内,它send的值'x''y'到生成器,因此在f中它将输出x 0 y 1。但我无法理解

  • 有2 yield s但3 send s。为什么要在第一时间发送None
  • 它会在最后StopIteration处抛出send。有没有办法避免这种例外?

有人可以解释一下吗?提前谢谢。

1 个答案:

答案 0 :(得分:10)

来自the documentation

  

当调用send()来启动生成器时,必须使用None作为参数调用它,因为没有yield表达式可以接收该值。

至于例外,你无法真正避免它。当迭代完成时,生成器抛出此异常,因此不要避免它,只需捕获它:

g = f()

try:
    g.send(None)
    g.send('x')
    g.send('y')
except StopIteration:
    print 'Done'