使用 itertools 模块中的组合函数
2007-03-29 12:37:13 来源:WEB开发网Python 2.2 对 Python 语言引入了简单的生成器,并根据底层迭代器重新构思了标准循环。在 Python 2.3 中,生成器成了标准(不需要 _future_),而且引入了新模块 itertools 以与迭代器一起灵活地工作。itertools 模块本质上是一组组合高阶函数,只不过这些函数与惰性迭代器一起工作,而不是与有限列表一起工作。在这篇专栏文章中,David 研究了该新模块,并使您感受一下组合迭代器所具有的富有表现力的强大新功能。
理解新概念
Python V2.2 中引入了迭代器的思想。唔,这并不十分正确;这种思想的“苗头”早已出现在较老的函数 xrange() 以及文件方法 .xreadlines() 中了。通过引入 yield 关键字,Python 2.2 在内部实现的许多方面推广了这一概念,并使编程定制迭代器变得更为简单( yield 的出现使函数转换成生成器,而生成器反过来又返回迭代器)。
迭代器背后的动机有两方面。将数据作为序列处理通常是最简单的方法,而以线性顺序处理的序列通常并不需要都同时实际 存在。
x*() 前兆提供了这些原理的清晰示例。如果您想对某操作执行成千上万次,那么执行您的程序可能要花些时间,但该程序一般不需要占用大量内存。同样,对于许多类型的文件,可以一行一行地处理,且不需要将整个文件存储在内存中。最好对其它所有种类的序列也进行惰性处理;它们可能依赖于通过通道逐步到达的数据,或者依赖于一步一步执行的计算。
大多数时候,迭代器用在 for 循环内,就象真正的序列那样。迭代器提供了 .next() 方法,它可以被显式调用,但有百分之九十九的可能,您所看到的是以下行:
for x in iterator:
do_something_with(x)
在对 iterator.next() 进行幕后调用而产生 StopIteration 异常时,该循环就被终止。顺便说一下,通过调用 iter(seq) ,实际序列可以被转换成迭代器 - 这不会节省任何内存,但是在下面讨论的函数中它会很有用。
更多精彩
赞助商链接