7 迭代器 可迭代对象
1. 可迭代对象
以直接作用于 for 循环的数据类型有以下几种: 一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等; 一类是 generator ,包括生成器和带 yield 的generator function。 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。
In [2]: for i in [1,2,3,4]: ...: print(i) ...: 1 2 3 4 In [3]: for i in "abc": ...: print(i) ...: a b c
### 生成器 In [6]: b = (x for x in range(10)) In [7]: b Out[7]: <generator object <genexpr> at 0x7f8b5d47d7d0> In [8]: for temp in b: ...: print(temp) ...: 0 1 2 3 4 5 6 7 8 9
2. 判断是否可以迭代
可以使用 isinstance() 判断一个对象是否是 Iterable 对象:
In [50]: from collections import Iterable In [51]: isinstance([], Iterable) Out[51]: True In [52]: isinstance({}, Iterable) Out[52]: True In [53]: isinstance('abc', Iterable) Out[53]: True In [54]: isinstance((x for x in range(10)), Iterable) Out[54]: True In [55]: isinstance(100, Iterable) Out[55]: False
3.判断迭代器
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用 isinstance() 判断一个对象是否是 Iterator 对象:
In [56]: from collections import Iterator In [57]: isinstance((x for x in range(10)), Iterator) #生成器是可迭代对象 Out[57]: True In [58]: isinstance([], Iterator) Out[58]: False In [59]: isinstance({}, Iterator) Out[59]: False In [60]: isinstance('abc', Iterator) Out[60]: False In [61]: isinstance(100, Iterator) Out[61]: False
4 迭代对象变成迭代器 iter()函数
生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator 。
把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数:
In [6]: a = [11,22,33,44] In [7]: type(a) Out[7]: list In [8]: iter(a) Out[8]: <list_iterator at 0x7f5804a4f550> In [9]: b = iter(a) In [10]: b Out[10]: <list_iterator at 0x7f5804a4ff60> In [11]: b.__next__() Out[11]: 11 In [12]: b.__next__() Out[12]: 22 In [13]: b.__next__() Out[13]: 33
总结
- 凡是可作用于 for 循环的对象都是 Iterable 类型;
- 凡是可作用于 next() 函数的对象都是 Iterator 类型
- 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。