Python生成器进阶

2019-12-19  本文已影响0人  王文强Python

一、yield 简介

1、生成器不仅可以产出值,还可以接收值,用send()方法。
2、注意:在调用send()发送非None值之前必须先启动生成器,
3、可以用 next()  、send(None)  两种方式激活
4、调用close.()之后,生成器再往下运行的时候就会产生出一个GeneratorExit,单数如果用try捕获异
常的话,就算捕获了遇到后面还有yield的话,还是不能往下运行,因为一旦调用close方法生成器就终
止运行了(如果还有next,就会会产生一个异常)所以我们不要去try捕捉该异常。
5、yield 前面加 = 号就实现了  (1)、可以产出值 。 (2)、可以接受调用者传过来的值。

二、yield from 功能总结:

1、子生成器生产的值,都是直接给调用方;调用发通过.send()发送的值都是直接传递给子生成器,
如果传递None,会调用子生成器的next()方法,如果不是None,会调用子生成器的send()方法。
2、子生成器退出的时候,最后的return EXPR,会触发一个StopIteration(EXPR)异常
3、yield from 表达式的值,是子生成器终止时,传递给StopIteration异常的第一个参数。
4、如果调用的时候出现了StopIteration异常,委托方生成器恢复运行,同时其他的异常向上冒泡。
5、传入委托生成器的异常里,除了GeneratorExit之后,其他所有异常全部传递给子生成器的.throw()
方法;如果调用.throw()的时候出现StopIteration异常,那么就恢复委托生成器的运行,其他的异常全
部向上冒泡
6、如果在委托生成器上调用.close()或传入GeneratorExit异常,会调用子生成器的.close()方法,没有
就不调用,如果在调用.close()时候抛出了异常,那么就向上冒泡,否则的话委托生成器跑出GeneratorExit 异常。

三、yield from 的用法:

1、后面跟一个可迭代的对象,yield from可以在调用方的驱使下将可迭代对象一个一个的输出。
2、作为委派生成器使用,使得调用方在得到生成器对象时,可以通过send()方法和真正的生成器
(这里为func)直接通信。委派生成器其实就是为调用方和真正的生成器提供了一个通道,这个通
道可以让它们直接通信。
上一篇下一篇

猜你喜欢

热点阅读