python学习笔记7 迭代器

转载 2016年06月01日 18:34:46

生成器对象都是迭代器对象

生成器  generator  迭代器 iterator

我们已经知道,可以直接作用于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

学习python2.7的迭代器

迭代器(iterator):一个表示数据流的对象。反复调用迭代器的__next__()方法(或给它传递内建函数(built-in function)next())来返回在该流中的后继项。当没有可用数...
  • qq_32621445
  • qq_32621445
  • 2016年03月11日 21:59
  • 520

python 学习笔记7进程和线程

多进程os 系统模块提供了进程的很多东西 os.getpid() 获取进程id pid = os.fork() fork创建一个新的进程 父进程返回子进程id 子进程返回0multiproce...
  • bleuesprit
  • bleuesprit
  • 2016年12月08日 20:23
  • 153

python迭代器 for循环

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

Python新手笔记之python迭代器遍历列表

Python的迭代器使用起来很方便,也比较实用,今天看一下几种Python迭代器的使用方法方法 第一种: list=["hello","world","china"] it=iter(list)...
  • u010223750
  • u010223750
  • 2016年01月09日 17:21
  • 1735

Python 迭代器的概念

使用迭代器的理由: 1、“流式”数据处理方式减少内存消耗: 比如处理文件,一下猛地把全部数据全部取出来放到内存里面进行处理会导致程序消耗大量内存,有时甚至没法做到,一般我们会一部分一部分的对文件内容进...
  • lujiandong1
  • lujiandong1
  • 2015年09月17日 12:14
  • 699

【Python】在Python中自定义迭代器Iterator

Python中迭代器本质上是每次调用.next()都返回一个元素或抛出StopIteration的容器对象。 在Python中其实没有“迭代器”这个类,具有以下2个特性的类都可以被称为“迭代器”类: ...
  • GhostFromHeaven
  • GhostFromHeaven
  • 2013年09月21日 20:22
  • 4595

python迭代器以及生成器

迭代,即重复做一些事很多次,python中通过for循环可以对序列、字典以及其他的对象进行迭代。在其他对象进行迭代时,需要在其他对象中实现__iter__方法。 __iter__方法返回一个迭代器,...
  • zhangjiuchao
  • zhangjiuchao
  • 2016年08月17日 17:01
  • 660

【Python那些事儿】Python中的迭代器

主要记录:迭代器(iterator)协议 对象必须提供一个next()方法,执行该方法时,要么返回迭代中的下一项,要么引起一个StopIteration异常。 只能往前访问,不会后退。 在Python...
  • duxu24
  • duxu24
  • 2016年12月21日 17:25
  • 1267

python3:迭代器

python支持在容器上迭代,通过两个方法实现,允许用户自定义,序列总是支持迭代方法,后面介绍序列的时候会涉及更多的细节。 容器中的迭代 容器需要定义下面的方法以提供迭代支持: containe...
  • liuy_98_1001
  • liuy_98_1001
  • 2015年03月25日 15:06
  • 2651

Python 文件迭代器

在python里面,文件迭代器的属性可以很好地帮助我完成generator所完成的功能。...
  • lyworm
  • lyworm
  • 2016年05月24日 17:16
  • 1858
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python学习笔记7 迭代器
举报原因:
原因补充:

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