1. 列表和迭代器区别
- 列表不论遍历多少次,表头位置始终是第一个元素;
- 迭代器遍历结束后,不再指向原来的表头位置,而是为最后元素的下一个位置;
通过 type
关键字可以看到列表和迭代器的类型是不同的。
In [1]: a = [1,2,3]
In [2]: b = iter(a)
In [3]: type(a)
Out[3]: list
In [4]: type(b)
Out[4]: list_iterator
通过 for
循环迭代列表和迭代器,
In [6]: for i in a:
...: print(i)
...:
1
2
3
In [7]: for j in b:
...: print(j)
...:
1
2
3
In [8]: for i in a:
...: print(i)
...:
1
2
3
In [9]: for j in b:
...: print(j)
...:
In [10]:
可以发现:
- 列表每次迭代都是从第一个元素开始;
- 而迭代器在迭代结束后再次迭代就不会有任何值。因为一旦迭代结束,就指向迭代器最后一个元素的下一个位置;
只有迭代器对象才能与内置函数 next
结合使用, next
一次,迭代器就前进一次,指向一个新的元素。所以,要想迭代器 b
重新指向 a
的表头,需要重新创建一个新的迭代器。
In [10]: b = iter(a)
In [11]: next(b)
Out[11]: 1
In [12]: next(b)
Out[12]: 2
In [13]: next(b)
Out[13]: 3
In [14]: next(b)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-14-adb3e17b0219> in <module>
----> 1 next(b)
StopIteration:
In [15]:
需要注意,我们无法通过调用 len
获得迭代器的长度,只能迭代到最后一个末尾元素时,才知道其长度。
2. 总结
- 遍历列表,表头位置始终不变;
- 遍历迭代器,表头位置相应改变;
next
函数执行一次,迭代对象指向就前进一次;StopIteration
触发时,意味着已到迭代器尾部;