迭代器

转载 2015年11月19日 11:11:49

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如listtupledictsetstr等;

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

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

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

>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False

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

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

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

>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数:

>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

你可能会问,为什么listdictstr等数据类型不是Iterator

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

小结

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

Python的for循环本质上就是通过不断调用next()函数实现的,例如:

for x in [1, 2, 3, 4, 5]:
    pass

实际上完全等价于:

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

相关文章推荐

Android迭代器模式demo

  • 2016年04月13日 16:53
  • 15.44MB
  • 下载

设计模式之迭代器模式

  • 2017年06月18日 18:58
  • 35KB
  • 下载

设计模式(9)---->迭代器模式

迭代器 一、 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生。我们常常使用JDK提供的迭代接口进行java Collection的遍历: List list = new ArrayLis...

C++容器、迭代器

  • 2013年04月24日 10:47
  • 1.67MB
  • 下载

(行为型模式) Iterator 迭代器模式

  • 2012年09月29日 23:50
  • 171KB
  • 下载

使用python迭代器生成斐波那契数列

斐波纳契数列以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*) 这个数列从第2项开始,每一项都等于前两项之和,而且当n趋向于无穷大时,前一项与后一项...

数据结构 模板与迭代器

  • 2013年01月23日 22:06
  • 497KB
  • 下载

ListView配合安卓适配器Adapter和迭代器Iterator的用法整理

ListView+Adapter+Iterator 二、Iterator 安卓迭代器Iterator对collection进行迭代,在处理显示数据时,可用于遍历数据,配合Adapter使用效...
  • easy41
  • easy41
  • 2016年10月19日 15:21
  • 125
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:迭代器
举报原因:
原因补充:

(最多只允许输入30个字)