使用 itertools 模块中的组合函数
2007-03-29 12:37:13 来源:WEB开发网一个更实际的示例可能类似于将事件流应用于有状态对象上,例如应用到 GUI 窗口小部件上。但是即使是上述简单示例也显示了迭代器组合器的 FP 风格。
基本迭代器工厂
itertools 中的所有函数都可以用纯 Python 轻松地实现为生成器。在 Python 2.3+ 中包含该模块的要点是为一些有用的函数提供标准行为和名称。尽管程序员可以编写他们自己的版本,但是每个人实际创建的变体都会有点不兼容。但是,另一方面是要以高效率的 C 代码实现迭代器组合器。使用 itertools 函数将比编写您自己的组合器稍微快一些。标准文档显示了每个 itertools 函数的等价纯 Python 实现,所以不需要在本文中重复这些内容了。
itertools 中的函数再基本不过了 - 而且命名也完全不同 - 这样从该模块导入所有名称可能就有意义了。例如,函数 enumerate() 可能明显地出现在 itertools 中,但是它在 Python 2.3+ 中却是一个内置函数。值得注意的是,您可以用 itertools 函数很方便地表达 enumerate() :
from itertools import *
enumerate = lambda iterable: izip(count(), iterable)
让我们首先看一下几个 itertools 函数,它们 没有将其它迭代器作为基础,而完全是“从头”创建迭代器。 times() 返回一个多次产生同一对象的迭代器;在本质上,这一能力比较有用,但它确实可以很好地替代使用过多的 xrange() 和索引变量,从而可以简单地重复一个操作。即,不必使用:
for i in xrange(1000):
do_something()
您现在就可以使用更中性的:
for _ in times(1000):
do_something()
如果 times() 只有一个参数,那么它只会重复产生 None 。函数 repeat() 类似于 times() ,但它无界地返回同一对象。不管是在包含独立 break 条件的循环中还是在象 izip() 和 imap() 这样的组合器中,这个迭代器都很有用。
更多精彩
赞助商链接