Python 迭代器

迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

可迭代对象

以直接作用于 for 循环的数据类型有以下几种:

  • 集合数据类型,如 list、 tuple、 dict、 set、 str 等;
  • generator,包括生成器和带 yield 的 generator function。

这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable。

判断是否可以迭代

可以使用 isinstance() 判断一个对象是否是 Iterable 对象:

1
2
3
4
5
6
7
8
9
10
>>> from collections import Iterable
>>> isinstance({}, Iterable)
True
>>> isinstance([], Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance(123, Iterable)
False
>>>

而生成器不但可以作用于 for 循环,还可以被 next() 函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。

迭代器

可以被 next() 函数调用并不断返回下一个值的对象称为迭代器:Iterator。

可以使用 isinstance() 判断一个对象是否是 Iterator 对象:

1
2
3
4
5
6
7
8
9
>>> from collections import Iterator
>>> isinstance('abc', Iterator)
False
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance((x for x in range(10)), Iterator)
True

iter() 函数

生成器都是 Iterator 对象,但 list、 dict、 str 虽然是 Iterable,却不是 Iterator。

把 list、 dict、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数:

1
2
3
4
5
6
7
8
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance(iter({}), Iterator)
True
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

总结

  • 凡是可作用于 for 循环的对象都是 Iterable 类型;
  • 凡是可作用于 next() 函数的对象都是 Iterator 类型
  • 集合数据类型如 list、 dict、 str 等是 Iterable 但不是 Iterator,不过可以通过 iter() 函数获得一个 Iterator 对象。
hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
  • 本文作者: hoxis | 微信公众号【不正经程序员】
  • 本文链接: https://hoxis.github.io/python-iterator.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!
0%