迭代是访问集合元素的⼀种⽅式。迭代器是⼀个可以记住遍历的位置的对象。迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退!
可迭代对象
以直接作⽤于 for 循环的数据类型有以下⼏种:
⼀类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
⼀类是 generator ,包括⽣成器和带 yield 的generator function。
这些可以直接作⽤于 for 循环的对象统称为可迭代对象: Iterable
In [1]: for s in "Hello":
...: print(s)
...:
H
e
l
l
o
In [2]: b = (x for x in range(5))
In [3]: b
Out[3]: <generator object <genexpr> at 0x0000021FEBC98A40>
In [4]: for tmp in b:
...: print(tmp)
...:
0
1
2
3
4
判断是否可以迭代
可以使⽤isinstance()
判断一个对象是否是Iterable (可迭代的)对象:
In [1]: from collections import Iterable
In [2]: isinstance([],Iterable)
Out[2]: True
In [3]: isinstance({},Iterable)
Out[3]: True
In [4]: isinstance('abc',Iterable)
Out[4]: True
In [5]: isinstance((x for x in range(5)),Iterable)
Out[5]: True
⽽⽣成器不但可以作⽤于 for 循环,还可以被 next() 函数不断调⽤并返回下⼀个值,直到最后抛出 StopIteration 错误表示⽆法继续返回下⼀个值了!
迭代器
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()
判断某个对象是否是 Iterator (迭代器)对象
In [1]: from collections import Iterator
In [2]: isinstance((x for x in range(10)),Iterator)
Out[2]: True
In [3]: isinstance([],Iterator)
Out[3]: False
In [4]: isinstance({},Iterator)
Out[4]: False
In [5]: isinstance("abc",Iterator)
Out[5]: False
In [6]: isinstance(100,Iterator)
Out[6]: False
所以说,生成器也是迭代器的一种!
iter()函数
生成器都是Iterator对象,但是list、dict、str虽然是Iterable,去不是Iterator
In [7]: isinstance(iter("abc"),Iterator)
Out[7]: True
In [8]: isinstance(iter([]),Iterator)
Out[8]: True
总结
- 凡是可作⽤于 for 循环的对象都是 Iterable 类型
- 凡是可作⽤于 next() 函数的对象都是 Iterator 类型
- 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator,不过可以通过 iter() 函数获得⼀个 Iterator 对象。