迭代器

转载 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

php中的iterator迭代器(遍历)

遍历主要用于遍历元素的操作,如对数组中的每一个元素都要操作,这个情况下我们就可以使用迭代器 interface Demo//这里描述了提供给开发者的接口 { public function fn1...
  • baixiaoshi
  • baixiaoshi
  • 2014年12月30日 23:26
  • 934

C++迭代器理解与实例详解

定义一个数组:char buff[1024];当我们用指针char *p(char *p = buff)遍历数组时,指针p指向一维数组首元素地址,每次都是从数组第一个元素的偏移到指定位置,即进行指针...
  • HappyToEat
  • HappyToEat
  • 2016年11月13日 09:23
  • 1117

迭代器的算术操作

    除了一次移动迭代器的一个元素的增量操作符外,vector迭代器(其他标准库容器迭代器很少)也支持 其他的算术操作.这些操作称为迭代器算术操作(iterator arithmetic),包括:i...
  • cool_mirror
  • cool_mirror
  • 2007年07月29日 16:50
  • 5050

C++的迭代器和指针

1:首先迭代器是一种专门为访问容器而设计的一种数据类型,同时也是一种数据结构,类模板,他提供来比下标操作更为通用的 方法,对所有的容器有适用;     2:每个容器都有自己的iterator类型...
  • aqiloveyou
  • aqiloveyou
  • 2014年06月07日 17:19
  • 2029

python迭代器 for循环

3. 迭代器 3.1. 迭代器(Iterator)概述 迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。 迭代器不能回退,只能往前...
  • lewis_bo
  • lewis_bo
  • 2015年02月11日 22:53
  • 1630

数据结构 《22》---- 二叉树三种遍历的迭代器算法

二叉树的三种遍历有递归版本,和迭代版本。本文介绍一种新的思路。 参考了 http://coolshell.cn/articles/9886.html 在许多应用中,我们还需要对遍历本身进行抽象...
  • u012653791
  • u012653791
  • 2014年07月07日 15:59
  • 1933

C++标准模板库(STL)迭代器的原理与实现

迭代器(iterator)是一种抽象的设计理念,本文探讨了迭代器的作用与原理,实现了简单的迭代器,并采用trait编程技巧编写了简单算法验证。...
  • wutao1530663
  • wutao1530663
  • 2017年03月22日 19:18
  • 2038

Map迭代器两种遍历方式

/* map接口中没有迭代器,那么该怎么遍历? 1:Set keySet() :获取到所有的键,存储到一个Set集合中,并返回该集合,因为Set有迭代器,                    ...
  • u011007829
  • u011007829
  • 2015年01月28日 18:06
  • 5351

Java中迭代器是什么?

可迭代是Java集合框架下的所有集合类的一种共性,也就是把集合中的所有元素遍历一遍。迭代的过程需要依赖一个迭代器对象,那么什么是迭代器呢?    迭代器(Iterator)模式,又叫做游标模式,它的含...
  • qq_33642117
  • qq_33642117
  • 2016年08月16日 21:31
  • 2630

c++从零开始学起(关于迭代器的使用)

迭代器是c++中用得比较多的一种访问机制。它定义了所有标准库容器以及vector、string等类型的迭代。 1、begin和end的使用:begin负责返回第一个元素的迭代器,end则返回容器最后一...
  • u010671202
  • u010671202
  • 2015年08月16日 21:22
  • 2371
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:迭代器
举报原因:
原因补充:

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