Fluent Python笔记--iter方法

2018-04-06  本文已影响21人  MontyOak

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方法),还实现了生成器客户端发送数据,允许客户代码和生成器之间数据交互。

上一篇下一篇

猜你喜欢

热点阅读