Python中的迭代器

  • baagee 发布于 2017-07-26 11:28:43
  • 分类:Python
  • 1190 人围观
  • 0 人喜欢

迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

1. 可迭代对象

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

一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;

一类是 generator ,包括生成器和带 yield 的generator function。

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

2. 判断是否可以迭代

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

In [22]: from collections import Iterable

In [23]: isinstance('sdgsfd',Iterable)
Out[23]: True

In [24]: isinstance({},Iterable)
Out[24]: True

In [25]: isinstance([],Iterable)
Out[25]: True

In [26]: isinstance((),Iterable)
Out[26]: True

In [27]: isinstance(111,Iterable)
Out[27]: False

In [28]: isinstance((x for x in range(9)),Iterable)
Out[28]: True

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

3.迭代器

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

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

In [29]: from collections import Iterator

In [30]: isinstance('4235',Iterator)
Out[30]: False

In [31]: isinstance(100,Iterator)
Out[31]: False

In [32]: isinstance([],Iterator)
Out[32]: False

In [33]: isinstance({},Iterator)
Out[33]: False

In [34]: isinstance((),Iterator)
Out[34]: False

In [35]: isinstance((x for x in range(9)),Iterator)
Out[35]: True

4.iter()函数

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

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

In [37]: isinstance([x for x in range(9)],Iterator)
Out[37]: False

In [38]: isinstance(iter([x for x in range(9)]),Iterator)
Out[38]: True

In [39]: isinstance(iter('sdfgdfhf'),Iterator)
Out[39]: True

In [41]: g=iter('sdfgdfhf')

In [42]: g
Out[42]: <str_iterator at 0xb5cff3cc>

In [43]: h=iter([x for x in range(9)])

In [44]: h
Out[44]: <list_iterator at 0xb5cffb0c>

In [45]: next(h)
Out[45]: 0

In [46]: next(h)
Out[46]: 1

5. 总结

  • 凡是可作用于 for 循环的对象都是 Iterable(可迭代) 类型;
  • 凡是可作用于 next() 函数的对象都是 Iterator (迭代器)类型
  • 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。


转载请说明出处:baagee博客 » Python中的迭代器
标签: Python 迭代器

评论

点击图片切换
还没有评论,快来抢沙发吧!