迭代器
参考博客:http://python.jobbole.com/81916/
可以直接作用于for循环的对象统称位可迭代对象(iterable).
可以被next()函数调用并不断返回下一个值的对象成为迭代器(iterator)。
所有的lterable均可以通过内置函数iter()来转化为iterator().
对迭代器来讲,有一个_next()就够了。在使用for和in语句的时候,程序就会自动调用即将被处理的对象的迭代器对象。然后使用它的next()方法,直到监测到一个Stopiteration异常。
>>> l = [1,2,3,4] >>> L = iter(l) >>> next(I) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'I' is not defined >>> next(L) 1 >>> next(L) 2 >>> next(L) 3 >>> next(L) 4 >>> next(L) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
上面例子中,列表I可以被for进行循环,但是不能被内置函数next()用来查找下一个值,所以I是iterable。
I通过iter进行包装后为L,L可以被next()用来查找下一个值,所以L是iterable。
for循环内部事实上就是先调用iter()把iterable变成iterator再进行循环迭代。
iterator继承自iterable,iterator包含__iter()和next()方法,而iterable仅仅包含iter__().
iterable需要包含有__iter()方法用来返回iterator,而iterator需要包含有next__()方法用来被循环。
如果我们自己定义迭代器,只要在类里面定义一个iter()函数,用它来返回一个带next()方法的对象就够了。
class Iterable: def __iter__(self): return Iterator() #转换成迭代器 class Iterator: def __init__(self): self.start = -1 def __next__(self): self.start +=2 if self.start > 10: raise StopIteration return self.start I = Iterable() for i in I: print(i) 结果: 1 3 5 7 9
上面的代码实现的是找到10以内的奇数,代码中的类名可以随便取。
如果在Iterator的__next__方法中没有实现Stoplteration异常,那么则是表示的全部为奇数,那么需要在调用的时候设置退出循环的条件。我们通过range来实现打印多少个元素,这里表示打印5个元素,返回的结果和上面一致。
class Iterable: def __iter__(self): return Iterator() class Iterator: def __init__(self): self.start = -1 def __next__(self): self.start +=2 return self.start I = Iterable() for count,i in zip(range(5),I): print(i)
可以把这两个合并在一起
class Iterable: def __iter__(self): #直接改变类型,传递到原来的参数上面 return self def __init__(self): self.start = -1 def __next__(self): self.start +=2 if self.start > 10: raise StopIteration return self.start I = Iterable() for i in I: print(i)
注意:迭代器不能向后移动,不能回到开始。