一、生产器的方法
在生成器开始运行后,可使用生成器和外部之间的通信渠道向它提供值。这个通信渠道包括如下两点:
外部世界:外部世界可访问生成器的方法send,这个方法类似next,但接受一参数(要发送的“信息”,可以是任何对象)。
生成器:在挂起的生成器内部,yield可能用作表达式而不是语句。换言之,当生成器重新运行时,yield返回一个值——通过send从外部世界发送的值。如果使用的是next,yield将返回None。
注意:仅当生成器被挂起(遇见第一个yield)后,使用send(而不是next)才有意义。
如果一定要在生成器刚启动时对其调用send方法,可向它传递参数None。
示例1:
1 def repeater(value): 2 while True: 3 new = (yield value) # 注意:此处用圆括号将yield表达式括起来了 4 if new is not None: 5 value = new
调用:
>>> r = repeater(42) # 第一次调用 >>> next(r) 42 >>> r.send("Hello World") # 仅当生成器被挂起(遇见第一个yield)后,使用send(而不是next)才有意义。 'Hello World'
注意:
如果要以某种方式使用返回值,就不管三七二十一,将其用圆括号括起来吧!!
二、生成器的另外两种方法:
throw:用于在生成器中(yield表达式处)引发异常,调用时可提供一个异常类型,一个可选值和一个traceback(回溯)对象。
close:用于停止生成器,调用时无需提供参数。
方法close也是基于异常的(由python垃圾收集器在需要时调用):在yield出引发GeneratorExit异常。
因此如果要在生成器中提供一些清理代码,可将yield放在一条try/finally语句中。如果愿意,也可捕获GeneratorExit异常,但随后必须重新引发它(可能在清理后)、引发其他异常或直接返回。
对生成器调用close后,再试图从它那里获取值将导致RuntimeError异常。