python迭代器和生成器详解__iter__和__next__先看开发中常用的一个for循环的使用:a=[1,2,3]foriina:print(i)123a是一个列表,也是一个迭代器;迭代器必须通过for循环遍历,遍历时默认会调用迭代器的iter()方法,并显示出来,相当于:foriiniter(a):print(i)123在理解迭代器之前,你必须理解魔法方法__iter__和__next__的调用。上面例子iter(a)背后就是调用对象a的__iter__方法,即a.__iter__();iter(a)返回什么?返回的是一个对象,内部实现了__next__()方法,每次调用__next__()弹出下一个值,完成遍历。示例:classA(object):def__init__(self,a):self.a=adef__next__(self):print('thisisnext')ifself.a<6:self.a+=1returnself.一个else:raiseStopIterationclassB(object):def__init__(self):passdef__iter__(self):print('thisisiter')returnA(a=0)>>>b=B()>>>foriinb:#Essentiallycalliter(b),orb.__iter__();返回一个实现了__next__方法的实例对象。>>>print(i)thisisiter#Firstcalliter(b)thisisnext#调用A的next,返回值为当前i。1thisisnext2thisisnext3thisisnext4thisisnext5thisisnext6thisisnext#for循环会自动捕获StopIteration异常。值得注意的两个概念:可迭代对象(Iterable):实现了__iter__的类可以称为可迭代的,一般__iter__返回一个实现了__next__方法的对象实例。这不是强制性的。如果自己实现__next__方法,自然可以返回self。迭代器(Iterator):类中实现了__iter__和__next__方法的对象。没有它们中的任何一个都不能调用迭代器;迭代器自然是可迭代的。对于上面两个类A和B的实例对象,A(0)既不是Iterable也不是Iterator;B()是Iterable但不是Iteratorfromcollections.abcimportIterable,Iterator>>>isinstance(a,Iterable)False>>>isinstance(a,Iterator)False>>>isinstance(b,Iterable)True>>>isinstance(b,Iterator)FalsePython的内置迭代器:列表、元组、字典、字符串集合和open()请注意,这些不是迭代器Iterator;因为对于迭代器来说,我们无法预先知道序列的长度,只能通过next()函数来按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要下一个数据的时候才会计算被退回。而显然列表、元组、字典等我们可以掌握全局的信息。IteratorIterator根据__iter__和__next__定义自己的迭代器:classMyrange(object):def__init__(self,stop,start=0):self.start=startself.stop=stopdef__iter__(self):returnselfdef__next__(self):如果self.start
