迭代器是一个可以记住遍历的位置的对象,它从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
可迭代的对象
可以使用For循环的数据类型,其中一种是集合数据类型,如list、tuple、dict、set、str等;另一种则是生成器,可以直接作用于for循环的对象统称为可迭代的对象(Iterable),判断是否是可迭代对象:
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
返回True则表明该对象是可迭代的。
迭代器
与普通的集合数据类型不同,生成器不但可以作用于for循环,还可以被__next__()
函数不断调用并返回下一个值,直到最后抛出StopIteration错误为止,那么,可以被__next__()
函数调用并不断返回下一个值的对象称为迭代器(Iterator),判断是否是迭代器对象:
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
生成器都是Iterator对象,但list、dict、str虽然是可迭代对象,但不是迭代器,把list、dict、str等可迭代对象变成迭代器可以使用iter()
函数
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
迭代器类
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__()
与 __next__()
,__iter__()
方法返回一个特殊的迭代器对象, 这个迭代器对象实现了__next__()
方法并通过 StopIteration 异常标识迭代的完成__next__()
方法(Python 2 里是 next())会返回下一个迭代器对象。
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)