迭代器,生成器,协程¶
迭代器,生成器,协程的关系:
- 实现__iter__和__next__方法的对象就是迭代器
- 生成器有__next__方法,本质上也是迭代器,使用yield替换了return,一次生成一个结果。
- 协程中yield作为参数,阻塞程序继续,等待传入数据,才能继续
迭代器(iterator)¶
可迭代(iterable)¶
python中任意的对象,只要它定义了可以返回一个迭代器的
__iter__方法,或者支持下表索引的__getitem__方法,那么它就是一个可迭代对象。
可迭代对象并不表示其就是一个迭代器
In :l = [1, 2, 3]
In :l.__iter__  # 列表”l“拥有方法”__iter__“,但不具有”__next__“方法
Out:<method-wrapper '__iter__' of list object at 0x7fcfee025b88>
In :l.__next__
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-14-39daa3570050> in <module>()
----> 1 l.__next__
AttributeError: 'list' object has no attribute '__next__'
In :next(l)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-15-cdc8a39da60d> in <module>()
----> 1 next(l)
TypeError: 'list' object is not an iterator
In :ll = iter(l)  # 使用“iter()”函数将列表生成“列表迭代器”
In :next(ll)
Out:1
In :next(ll)
Out:2
In :next(ll)
Out:3
In :next(ll)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-20-f4a50bb27fab> in <module>()
----> 1 next(ll)
StopIteration:  # 迭代结束,触发“StopIteration”异常
迭代器实例¶
实现__iter__和__next__的对象就是迭代器,其中__iter__方法返回迭代器本身,next方法返回容器下一项内容,没有后续元素时,抛出StopIteration异常
class Fib:
    def __init__(self, max):
        self.a = 0
        self.b = 1
        self.max = max
    def __iter__(self):
        return self
    def __next__(self):
       fib = self.a
       if fib > self.max:
            raise StopIteration
       self.a, self,b = self.b, self.a + self.b
       return fib
生成器(generator)¶
生成器本质上是一个迭代器,只是表达更简洁
生成器表达式¶
协程(coroutine)¶
yield作为参数被传入
当调用send方法时,就是协程