python 迭代器(转)
来源:互联网 发布:cv录音软件 编辑:程序博客网 时间:2024/09/21 06:21
转自:[http://www.jb51.net/article/52234.htm]
本文以实例详解了python的迭代器与生成器,具体如下所示:
1. 迭代器概述:
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。
1.1 使用迭代器的优点
对于原生支持随机访问的数据结构(如tuple、list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值)。但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式。
另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件,或是斐波那契数列等等。
迭代器更大的功劳是提供了一个统一的访问集合的接口,只要定义了iter()方法对象,就可以使用迭代器访问。
迭代器有两个基本的方法
next方法:返回迭代器的下一个元素
_iter_方法:返回迭代器对象本身
下面用生成斐波那契数列为例子,说明为何用迭代器
示例代码1
def fab(max): n, a, b = 0, 0, 1 while n < max: print b a, b = b, a + b n = n + 1
直接在函数fab(max)中用print打印会导致函数的可复用性变差,因为fab返回None。其他函数无法获得fab函数返回的数列。
示例代码2
def fab(max): L = [] n, a, b = 0, 0, 1 while n < max: L.append(b) a, b = b, a + b n = n + 1 return L
代码2满足了可复用性的需求,但是占用了内存空间,最好不要。
示例代码3
对比:
for i in range(1000): passfor i in xrange(1000): pass
前一个返回1000个元素的列表,而后一个在每次迭代中返回一个元素,因此可以使用迭代器来解决复用可占空间的问题
class Fab(object): def __init__(self, max): self.max = max self.n, self.a, self.b = 0, 0, 1 def __iter__(self): return self def next(self): if self.n < self.max: r = self.b self.a, self.b = self.b, self.a + self.b self.n = self.n + 1 return r raise StopIteration()
执行
>>> for key in Fabs(5): print key
Fabs 类通过 next() 不断返回数列的下一个数,内存占用始终为常数
1.2 使用迭代器
使用内建的工厂函数iter(iterable)可以获取迭代器对象:
>>> lst = range(5)>>> it = iter(lst)>>> it<listiterator object at 0x01A63110>
使用next()方法可以访问下一个元素:
>>> it.next()>>> it.next()>>> it.next()
python处理迭代器越界是抛出StopIteration异常
>>> it.next()>>> it.next<method-wrapper 'next' of listiterator object at 0x01A63110>>>> it.next()>>> it.next()Traceback (most recent call last): File "<pyshell#27>", line 1, in <module> it.next()StopIteration
了解了StopIteration,可以使用迭代器进行遍历了
lst = range(5)it = iter(lst)try: while True: val = it.next() print valexcept StopIteration: pass
事实上,因为迭代器如此普遍,python专门为for关键字做了迭代器的语法糖。在for循环中,Python将自动调用工厂函数iter()获得迭代器,自动调用next()获取元素,还完成了检查StopIteration异常的工作。如下
>>> a = (1, 2, 3, 4)>>> for key in a: print key
首先python对关键字in后的对象调用iter函数迭代器,然后调用迭代器的next方法获得元素,直到抛出StopIteration异常。
- python 迭代器(转)
- python迭代器
- python迭代器
- python 迭代器
- Python 迭代器
- Python:迭代器
- python 迭代器
- Python--迭代器
- python迭代器
- python 迭代器
- Python--迭代器
- python迭代器
- Python 迭代器
- Python 迭代器
- [python]迭代器
- python 迭代器
- python 迭代器
- Python 迭代器
- 计算机命令
- 汉诺塔实现程序(C++)
- 程序自我复制(c++)
- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
- 笔记本卸载VMware后出现键盘和触摸板用不了
- python 迭代器(转)
- 数据结构--栈的两个简单应用
- Ubantu12.04中文显示乱码解决方法
- 无法启动程序···系统找不到指定的文件解决方法
- 任务管理器显示不全
- LinkedList和ArrayList区别
- 华硕笔记本电脑BIOS设置fancystart后黑屏
- tomcat+redis集群管理session
- 32位PE系统安装64位原版win7系统