WEB开发网
开发学院软件开发Python 使用 itertools 模块中的组合函数 阅读

使用 itertools 模块中的组合函数

 2007-03-29 12:37:13 来源:WEB开发网   
核心提示: 一个更实际的示例可能类似于将事件流应用于有状态对象上,例如应用到 GUI 窗口小部件上,使用 itertools 模块中的组合函数(3),但是即使是上述简单示例也显示了迭代器组合器的 FP 风格,基本迭代器工厂itertools 中的所有函数都可以用纯 Python 轻松地实现为生成器,但

一个更实际的示例可能类似于将事件流应用于有状态对象上,例如应用到 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() 这样的组合器中,这个迭代器都很有用。

上一页  1 2 3 4 5 6  下一页

Tags:使用 itertools 模块

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接