Python - 理解生成器的send函数

11

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

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

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

在全局范围内,它向生成器发送值'x'、'y',因此在函数f中,它将输出x 0 y 1。但我无法理解:

  • 为什么第一次要发送None,而不是两个值中的一个?
  • 最后一个send会抛出StopIteration异常,有没有什么办法可以避免这个异常?

有人能解释一下吗?谢谢!

1个回答

11

根据文档

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

至于异常,你真的无法避免它。生成器在迭代完成时抛出此异常,因此除了捕获它之外,别无选择:

g = f()

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

有一种方法可以避免异常。在生成器函数的末尾添加一个额外的 yield。生成器不会关闭,但最终将被垃圾回收。 - Rafa Viotti
g.send(None) 没有意义,但必须添加。 - shenyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接