
上QQ阅读APP看书,第一时间看更新
4.7 迭代器
前面介绍了直接作用于for循环的数据类型,一类是集合类型,比如列表、元组、字典、集合和字符串等。还有一类就是生成器(generator)。以上这些可以直接作用于for循环的对象统称为可迭代对象(Iterable)。
Python有可以判断某个对象是否为可迭代类型的方法——isinstance()。当然isinstance()不仅仅可用于判断可迭代对象,也可以判断其他类型,大家可以举一反三。
例4-25 判断可迭代对象


这里介绍一个新的可迭代对象——迭代器(Iterator)。它的定义是:实现next()方法并且是可迭代对象就是迭代器[next()函数就是上一章节反复调用生成器用到的next()函数],更简便的方法就是用isinstance()来判断某个对象是否是生成器Iterator。
例4-26 判断是否为迭代器

可以看到x for x in range(10)既实现了迭代,又实现了next方法,所以它就是迭代器Iterator。另外三个对象列表、字典和字符串'abc'虽然是可迭代对象,却不是迭代器。迭代器通常表示的是一个数据流,可以被next函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration的错误。我们无法提前知道这个数据流的长度,只能通过不断地用next函数按需求计算下一个数据。
虽然数据类型list、dict、str等都是可迭代对象不是迭代器,不过却可以通过iter函数强制转换成迭代器。
例4-27 字符串转化为迭代器

使用迭代器不要求事先准备好整个迭代过程中的所有元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大甚至无限的序列。