10

我正在学习 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'fx 0 y 1

  • 有 2yield秒,但有 3send秒。为什么要None第一时间发送?
  • StopIteration它最后抛出一个send。有什么办法可以避免这个异常?

谁能解释一下?提前致谢。

4

1 回答 1

10

文档中

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

至于例外,你真的无法避免。生成器在完成迭代时会抛出此异常,因此与其避免它,不如直接捕获它:

g = f()

try:
    g.send(None)
    g.send('x')
    g.send('y')
except StopIteration:
    print 'Done'
于 2012-12-05T05:04:26.950 回答