迭代器
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
1. 可迭代对象
以直接作用于 for 循环的数据类型有以下几种:
一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
一类是 generator ,包括生成器和带 yield 的generator function。
这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。
2.判断是否可以迭代
可以用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((),Iterable)
Out[4]: True
In [5]: isinstance('avcsd',Iterable)
Out[5]: True
In [6]: isinstance(100,Iterable)
Out[6]: False
3.迭代器
可以被next()函数调用并不断返回的下一个值的对象称为迭代器:Iterator
可以用isinstance()判断一个对象是否是Iterator对象
In [7]: from collections import Iterator
In [8]: is
is isinstance issubclass
In [8]: isinstance([],Iterator)
Out[8]: False
In [9]: isinstance({},Iterator)
Out[9]: False
In [10]: isinstance((),Iterator)
Out[10]: False
In [11]: isinstance('adsf',Iterator)
Out[11]: False
In [12]: isinstance(100,Iterator)
Out[12]: False
In [13]: isinstance((x for x in range(10)),Iterator)
Out[13]: True
4. iter()函数
生成器都是Iterator对象,但list,dict, str虽然是可迭代对象,但不是迭代器,把他们转换成迭代器要用iter()函数
In [15]: isinstance(iter([]),Iterator)
Out[15]: True
In [16]: a=[1,2,3]
In [17]: b=iter(a)
In [18]: isinstance(b,Iterator)
Out[18]: True
In [19]: next(b)
Out[19]: 1
In [20]: next(b)
Out[20]: 2
In [21]: next(b)
Out[21]: 3
In [22]: next(b)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-22-641a931447e8> in <module>()
----> 1 next(b)
StopIteration:
转换后变为迭代器,可以使用next()函数依次取出每个值,直到最后没有值报异常
总结
- 凡是可作用于 for 循环的对象都是 Iterable 类型;
- 凡是可作用于 next() 函数的对象都是 Iterator 类型
- 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。