python迭代器与iter()函数实例教程
python迭代器与iter()函数实例教程
- 发布时间:2014-07-16编辑:脚本学堂
迭代器是在版本 2.2 被加入 Python 的,它为类序列对象提供了一个类序列的接口。
序列是一组数据结构,你可以利用它们的索引从0 开始一直“迭代“ 到序列的最后一个条目。
用“计数“的方法迭代序列是很简单的。
Python 的迭代无缝地支持序列对象,而且它还允许程序员迭代非序列类型,包括用户定义的对象。
迭代器用起来很灵巧,可以迭代不是序列但表现出序列行为的对象,例如字典的 key,一个文件的行等。
当使用循环迭代一个对象条目时,几乎不可能分辨出它是迭代器还是序列。不必去关注这些,因为 Python 让它象一个序列那样操作。
如何迭代?
迭代器就是有一个 next() 方法的对象,而不是通过索引来计数。当你或是一个循环机制(例如 for 语句)需要下一个项时,调用迭代器的 next() 方法就可以获得它。条目全部取出后,会引发一个 StopIteration 异常,这并不表示错误发生,只是告诉外部调用者,迭代完成.
不过,迭代器也有一些限制。例如你不能向后移动,不能回到开始,也不能复制一个迭代器.如果你要再次(或者是同时)迭代同个对象,你只能去创建另一个迭代器对象。不过,这并不糟糕,因为还有其他的工具来帮助你使用迭代器。(www.jbxue.com 脚本学堂 整理)
reversed() 内建函数将返回一个反序访问的迭代器。enumerate() 内建函数同样也返回迭代器.另外两个新的内建函数,any() 和 all() ,在 Python 2.5 中新增,如果迭代器中某个/所有条目的值都为布尔真时,则它们返回值为真。本章先前部分展示了如何在 for 循环中通过索引或是可迭代对象来遍历条目。同时 Python 还提供了一整个 itertools 模块,它包含各种有用的迭代器.
一,使用迭代器
===序列===
正如先前提到的,迭代 Python 的序列对象和你想像的一样:
>>> i = iter(myTuple)
>>> i.next()
123
>>> i.next()
‘xyz’
>>> i.next()
45.67
>>> i.next()
Traceback (most recent call last):
File “<stdin>”,line 1,in <module>
StopIteration
如果这是一个实际应用程序,那么需要把代码放在一个 try-except 块中。序列现在会自动地产生它们自己的迭代器,所以一个 for 循环:
do_something_to(i)
实际工作方式:
不过不需要改动你的代码,因为 for 循环会自动调用迭代器的 next() 方法(以及监视StopIteration 异常)。
===字典===
字典和文件是另外两个可迭代的 Python 数据类型。字典的迭代器会遍历它的键(keys).
语句 for eachKey in myDict.keys() 可以缩写为 for eachKey in myDict ,例如:
… (‘Gaudi’,‘architect’): (1852,1906,1987),
… (‘Freud’,‘psychoanalyst’): (1856,1939,1990)
… }
…
>>> for eachLegend in legends:
… print ‘Name: %stOccupation: %s‘ % eachLegend
… print ‘ Birth: %stDeath: %stAlbum: %sn‘
… % legends[eachLegend]
…
Name: Freud Occupation: psychoanalyst
Birth: 1856 Death: 1939 Album: 1990
Name: Poe Occupation: author
Birth: 1809 Death: 1849 Album: 1976
Name: Gaudi Occupation: architect
Birth: 1852 Death: 1906 Album: 1987
另外,Python 还引进了三个新的内建字典方法来定义迭代:
myDict.iterkeys() (通过 keys 迭代),myDict.itervalues() (通过 values 迭代),以及 myDicit.iteritems() (通过 key/value 对来迭代)。(www.jbxue.com 脚本学堂 整理)
注意,in操作符也可以用于检查字典的 key 是否存在,之前的布尔表达式myDict.has_key(anyKey) 可以被简写为 anyKey in myDict。
===文件===
文件对象生成的迭代器会自动调用 readline() 方法。
这样循环就可以访问文本文件的所有行。程序员可以使用 更简单的 for eachLine in myFile 替换 for eachLine in myFile.readlines():
>>> for eachLine in myFile:
… print eachLine,# comma suppresses extra n
…
[EditorWindow]
font-name: courier new
font-size: 10
>>> myFile.close()
二,可变对象和迭代器
记住,在迭代可变对象的时候修改它们并不是个好主意。这在迭代器出现之前就是一个问题。
一个流行的例子就是循环列表的时候删除满足(或不满足)特定条件的项:
if not eachURL.startswith(‘http://’):
allURLs.remove(eachURL) # YIKES!!
除列表外的其他序列都是不可变的,所以危险就发生在这里。一个序列的迭代器只是记录你当前到达第多少个元素,所以如果你在迭代时改变了元素,更新会立即反映到你所迭代的条目上.在迭代字典的 key 时,你绝对不能改变这个字典。使用字典的 keys() 方法是可以的,因为keys() 返回一个独立于字典的列表。而迭代器是与实际对象绑定在一起的,它将不会继续执行下去:
>>> for eachKey in myDict:
… print eachKey,myDict[eachKey]
… del myDict[eachKey]
… a 1
Traceback (most recent call last):
File “<stdin>”,line 1,in <module>
RuntimeError: dictionary changed size during iteration
这样可以避免有缺陷的代码。更多有关迭代器的细节请参阅 PEP 234 .
三,如何创建迭代器
对一个对象调用 iter() 就可以得到它的迭代器。它的语法如下:
iter(obj)
iter(func,sentinel)
如果传递一个参数给 iter() ,它会检查你传递的是不是一个序列,如果是,那么很简单:
根据索引从 0 一直迭代到序列结束。另一个创建迭代器的方法是使用类,将在第 13 章详细介绍,一个实现了 __iter__() 和 next() 方法的类可以作为迭代器使用.
如果是传递两个参数给 iter() ,它会重复地调用 func ,直到迭代器的下个值等于sentinel。
您可能感兴趣的文章:
与 python迭代器与iter()函数实例教程 有关的文章
python迭代器与iter()函数实例教程的更多相关文章
- 浅析python迭代器及生成器函数
1. 什么是迭代协议? 迭代协议主要包括两方面的协议集,一种是迭代器协议,另一种是可迭代协议.对于迭代器协议来说,其要求迭代器对象在能够在迭代环境中一次产生一个结果.对于可迭代协议来说,就是一个对象序 ...
- 迭代器和iter()函数
1.先来个样例,有个初步的印象: myTuple=(123,'xyz',45.67) i=iter(myTuple) i.next() 123 i.next() 'xyz' i.next() 45.6 ...
- python之路_函数实例及装饰器介绍
一.习题讲解 1.写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组.例如:[(‘红心’,2), (‘草花’,2), …(‘黑桃,‘A’)] def cards(): num=[] for v ...
- python3 发生器 迭代器 内置函数 协程 哈哈我又回来啦
唉 犯傻了,干了一件虽有一点点道理的事情,但是却完全没有效果,我是不是傻,浪费了这么多时间在一件不可能的事情上,果然效果比道理更重要... 被一些琐事耽搁几天,python的学习都给我停了,擦!不过一 ...
- python 迭代器(一):迭代器基础(一) 语言内部使用 iter(...) 内置函数处理可迭代对象的方式
简介 在 Python 中,所有集合都可以迭代.在 Python 语言内部,迭代器用于支持: 1.for 循环2.构建和扩展集合类型3.逐行遍历文本文件4.列表推导.字典推导和集合推导5.元组拆包6. ...
- python iter函数用法
iter函数用法简述 Python 3中关于iter(object[, sentinel)]方法有两个参数. 使用iter(object)这种形式比较常见. iter(object, sentinel ...
- Python iter() 函数
Python iter() 函数 Python 内置函数 描述 iter() 函数用来生成迭代器. 语法 以下是 iter() 方法的语法: iter(object[, sentinel]) 参数 ...
- Python迭代器(函数名的应用,新版格式化输出)
1. 函数名的运用 你们说一下,按照你们的理解,函数名是什么? 函数名的定义和变量的定义几乎一致,在变量的角度,函数名其实就是一个变量,具有变量的功能:可以赋值:但是作为函数名他也有特殊的功能 ...
- python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)
1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...
随机推荐
- Hibernate 应用
完善的持久化层应该达到以下目标: 1.代码可重用性高,能够完成所有的数据库访问操作. 2.如果有需要的话,能够支持多种数据库平台. 3.具有相对独立性,当持久化层的实现发生变化,不会影响上层的实现. ...
- zend stuido 12.5的插件安装和xdebug调试器的配置和和配置注意
参考: zend stuido 12.5的插件安装 zend 12.5 安装插件是按类别进行分类了的, 而且是在欢迎 界面就可以直接安装, 安装后,要重启zend才能生效 版式设计的一个基本点就是: ...
- strtr函数的用法
http://php.net/manual/en/function.strtr.php <?php $trans = array("h" => "-" ...
- Redis在WEB开发中的应用与实践
Redis在WEB开发中的应用与实践 一.Redis概述: Redis是一个功能强大.性能高效的开源数据结构服务器,Redis最典型的应用是NoSQL.但事实上Redis除了作为NoSQL数据库使用之 ...
- acdream1233 Royal Federation (构造?)
http://acdream.info/problem?pid=1233 Andrew Stankevich's Contest (3) ASC 3 Royal Federation Special ...
- URAL1826. Minefield 题解
原题: http://acm.timus.ru/problem.aspx?space=1&num=1826 1826. MinefieldTime limit: 0.5 secondMemor ...
- css定位之z-index问题分析
新手先去看看 CSS z-index 属性 CSS z-index 属性的使用方法和层级树的概念 ---------------------------------------------- ...
- Inside the c++ object module 阅读摘要
这本书是 Stanley B. Lippman于1996年所写,而最早的c++标准是 ISO/IEC 14882:1998[18],即C++98. Chapter 1: Object Lessons ...
- 如何利用cookie来保存用户登录账号
众所周知,cookie在网页编写中不接或缺,今天就谈谈如何利用cookie技术来保存用户登录账号 1.首先是否保存用户登录账号当然是用户自行决定,所以我们需要在用户登录界面设置一个复选框,以此取得用户 ...
- 【C语言入门教程】3.2 数据的输入 与 输出
在程序的运行过程中,通常需要用户输入一些数据,而程序运算所得到的计算结果等又需要输出给用户,由此实现人与计算机之间的交互.所以在程序设计中,输入输出语句是一类必不可少的重要语句.在 C 语言中,没有专 ...