迭代器
迭代是访问集合元素的⼀种⽅式。迭代器是⼀个可以记住遍历的位置的对
象。迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结
束。迭代器只能往前不会后退。

1. 可迭代对象
以直接作⽤于 for 循环的数据类型有以下⼏种:
⼀类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
⼀类是 generator ,包括⽣成器和带 yield 的generator function。
这些可以直接作⽤于 for 循环的对象统称为可迭代对象: Iterable 。

2. 判断是否可以迭代

可以使⽤ isinstance() 判断⼀个对象是否是 Iterable 对象:

from collections import Iterable
print(isinstance([], Iterable))#True

print(isinstance({}, Iterable))#True

print(isinstance('abc', Iterable))#True

print(isinstance((x for x in range(10)), Iterable))#True

print(isinstance(100, Iterable))#False

 

⽽⽣成器不但可以作⽤于 for 循环,还可以被 next() 函数不断调⽤并返回下
⼀个值,直到最后抛出 StopIteration 错误表示⽆法继续返回下⼀个值了。
3.迭代器
可以被next()函数调⽤并不断返回下⼀个值的对象称为迭代器:Iterator。
可以使⽤ isinstance() 判断⼀个对象是否是 Iterator 对象:

from collections import Iterator
print(isinstance((x for x in range(10)), Iterator))#True

print(isinstance([], Iterator))#False

print(isinstance({}, Iterator))#False

print(isinstance('abc', Iterator))#False

print(isinstance(100, Iterator))#False

 

4.iter()函数
⽣成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是
Iterator 。
把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使⽤ iter() 函数:

print(isinstance(iter([]), Iterator))#True

print(isinstance(iter('abc'), Iterator))#True

 

总结
凡是可作⽤于 for 循环的对象都是 Iterable 类型;
凡是可作⽤于 next() 函数的对象都是 Iterator 类型
集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可
以通过 iter() 函数获得⼀个 Iterator 对象。