yield from
如果一个生成器要从另一个生成器产出值,一般的做法是for语句嵌套:
>>> def chain(*iterables):
... for it in iterables:
... for i in it:
... yield i
...
>>> s = 'ABC'
>>> t = tuple(range(3))
>>> list(chain(s, t))
['A', 'B', 'C', 0, 1, 2]
为了简化写法,PEP380引入了yield from
句法:
>>> def chain(*iterables):
... for i in iterables:
... yield from i
...
>>> list(chain(s, t))
['A', 'B', 'C', 0, 1, 2]
除了代替嵌套循环之外,yield from
创建了通道,将内层生成器与外层生成器客户端联系起来。这对于生成器类的协程尤为重要。
iter方法
对于可迭代对象使用iter方法可以返回一个迭代器,但是iter方法还有第二个参数:
>>> def d6():
... return randint(1, 6)
...
>>> d6_iter = iter(d6, 1) # 当返回值为1时抛出StopIteration,所以1是不会被打印出来的
>>> d6_iter
<callable_iterator object at 0x00000000029BE6A0>
>>> for roll in d6_iter:
... print(roll)
...
4
3
6
3
生成器型协程
总所周知,yield
用于实现生成器。随后引入了send
方法。send
方法不仅可以把生成器推进到下一步(类似next
方法),还实现了生成器客户端发送数据,允许客户代码和生成器之间数据交互。
网友评论