迭代器是在版本 2.2 被加入Python 的,它为类序列对象提供了一个类序列的接口。Python 的迭代无缝地支持序列对象,而且它还允许迭代非序列类型,包括用户定义的对象。它的出现,对列表迭代、字典迭代带来了性能上的增强。

迭代器用起来很灵巧,可以迭代不是序列但表现出序列行为的对象,例如字典的 key ,一个文件的行,等等。当你使用循环迭代一个对象条目时,你几乎不可能分辨出它是迭代器还是序列。

根本上说,迭代器就是一个实现了 next() 方法的对象,当你需要下一个项时(或在一个像for语句这样的循环机制中),调用迭代器的 next() 方法就可以获得它。条目全部取出后,会引发一个 StopIteration异常,这并不表示错误发生,只是告诉外部调用者,迭代完成。

不过,迭代器也有一些限制。例如你不能向后移动,不能回到开始,也不能复制一个迭代器。如果要再次(或者是同时)迭代同个对象,你只能去创建另一个迭代器对象。

简单实用迭代器的例子如下:

>>> myTuple = (123, 'xyz', 45.67)
>>> i = iter(myTuple)
>>> i.next()
123
>>> i.next()
'xyz'
>>> i.next()
45.67
>>> i.next()
Traceback (most recent call last):
File "", line 1, in ?
StopIteration

如果这是一个实际应用程序,那么需要把代码放在一个 try-except 块中。序列现在会自动地产生它们自己的迭代器,所以一个 for 循环:

for i in seq:
do_something_to(i)

实际上是这样工作的:

fetch = iter(seq)
while True:
try:
i = fetch.next()
except StopIteration:
break
do_something_to(i) 

for 循环会自动调用迭代器的 next() 方法,并监视StopIteration 异常。

字典和文件是另外两个可迭代的 Python 数据类型。

字典的迭代器会遍历它的键(keys),语句 for eachKey in myDict.keys() 可以缩写为 for eachKey in myDict 。

另外,Python 还引进了三个新的内建字典方法来定义迭代:

myDict.iterkeys() (通过 keys 迭代),

myDict.itervalues() (通过 values 迭代),

myDicit.iteritems() (通过 key/value 对来迭代)。

文件对象生成的迭代器会自动调用 readline() 方法。这样,循环就可以访问文本文件的所有行。可以使用更简单的for eachLine in myFile 替换 for eachLine in myFile.readlines()。

记住,在迭代可变对象的时候修改它们不是个好主意,比如在迭代字典的 key 时,你绝对不能改变这个字典。

>>> myDict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> for eachKey in myDict:
... print eachKey, myDict[eachKey]
... del myDict[eachKey] ...a 1
Traceback (most recent call last):
File "",line 1,in ?
RuntimeError:dictionary changed size during iteration

使用字典的 keys() 方法是可以的,因为keys()返回一个独立于字典的列表:

>>> for eachKey in myDict.keys():
... print eachKey, myDict[eachKey]
... del myDict[eachKey]
... c 3
b 2
d 4 >>> myDict
{}

创建迭代器,对一个对象调用iter() 就可以得到它的迭代器。它的语法如下:

iter(obj)

iter(func,  sentinel)

如果传递一个参数给 iter() ,它会检查你传递的是不是一个序列,如果是,那么很简单:根据索引从 0 一直迭代到序列结束。另一个创建迭代器的方法是使用类:一个实现了__iter__() 和 next() 方法的类可以作为迭代器使用。

如果是传递两个参数给iter() ,它会重复地调用 func ,直到迭代器的下个值等于sentinel。一个简单的例子如下:

>>> def fun():
... return 1
... >>> myiter = iter(fun, 2)
>>> myiter.next()
1 >>> for i in myiter:
... print i 1
1
1
1
1......(死循环)

reversed() 内建函数将返回一个反序访问的迭代器。enumerate() 内建函数同样也返回迭代器。另外两个新的内建函数any() 和 all(),在 Python 2.5 中新增,如果迭代器中某个/所有条目的值都为布尔真时,则它们返回值为真。

Python基础:07迭代器的更多相关文章

  1. (转)python基础之迭代器协议和生成器(一)

    一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  2. Day4 - Python基础4 迭代器、装饰器、软件开发规范

    Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...

  3. Python基础之迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  4. python基础之迭代器协议和生成器

    迭代器和生成器补充:http://www.cnblogs.com/luchuangao/p/6847081.html 一 递归和迭代 略 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个ne ...

  5. python基础8 -----迭代器和生成器

    迭代器和生成器 一.迭代器 1.迭代器协议指的是对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2. ...

  6. 【Python基础】迭代器、生成器

    迭代器和生成器 迭代器 一 .迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单 ...

  7. python基础之迭代器协议和生成器(一)

    一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  8. python基础之迭代器、生成器、装饰器

    一.列表生成式 a = [0,1,2,3,4,5,6,7,8,9] b = [] for i in a: b.append(i+1) print(b) a = b print(a) --------- ...

  9. python基础之迭代器、装饰器、软件开发目录结构规范

    生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大 ...

  10. python基础知识---迭代器、生成器、装饰器

    一.迭代器 二.生成器 http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html def func(): #定义生成器,和普通函数的区别是 ...

随机推荐

  1. bzoj 3029 守卫者的挑战——概率期望dp+状态数思考

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3029 先随便写了个dfs,记录“前 i 次.成功 j 次.容量-残片=k”的概率.因为是否可 ...

  2. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之SimpleRemoteWithUndoTest[转]

    命令模式可以很轻松的实现撤销(Undo)功能. 命令的接受者:  1unit uReceiveObject;  2  3interface  4  5type  6  TLight = class(T ...

  3. stackless 安装

    1.下载源码 https://bitbucket.org/stackless-dev/stackless/wiki/Download 2.编译.安装.路径生效 apt-get install libr ...

  4. wpf样式与行为

  5. 使用SpringBoot发送mail邮件

    1.前言 发送邮件应该是网站的必备拓展功能之一,注册验证,忘记密码或者是给用户发送营销信息.正常我们会用JavaMail相关api来写发送邮件的相关代码,但现在springboot提供了一套更简易使用 ...

  6. day38 03-Spring的IOC和DI的区别

    在IOC中有一个DI的概念. IOC是控制反转,DI是依赖注入.现在编写的类里面是没有其他的属性的.如果你学过像UML设计的话, 电视没有遥控器,按按钮也可以,但是紧密的那种,像人和四肢,人如果没有了 ...

  7. Leetcode74. Search a 2D Matrix搜索二维矩阵

    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入: matrix ...

  8. 【python之路20】函数作为参数

    1.函数可以作为参数 1)函数名相当于变量指向函数 2)函数名后面加括号表示调用函数 #!usr/bin/env python # -*- coding:utf-8 -*- def f1(args): ...

  9. HR招聘_(三)_招聘方法论(招聘途径及流程)

    1.招聘途径 网络招聘:企业官网,招聘网站,微信,论坛等. 校园招聘:学校信息栏海报,学校组织招聘会,校企业联合专场. 现场招聘会: 专场招聘会,人才市场招聘会. 猎头公司:猎头(年薪高于350K), ...

  10. Phpstrom学习笔记

    1.用*标识编辑过的文件 File - Editor – General - Editor Tabs 选中Mark modifyied tabs with asterisk