Python3的生成器generator(2)

一、生产器的方法

在生成器开始运行后,可使用生成器和外部之间的通信渠道向它提供值。这个通信渠道包括如下两点:

外部世界:外部世界可访问生成器的方法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异常。

猜你喜欢

转载自www.cnblogs.com/gepu1991/p/9152797.html