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

使用 itertools 模块中的组合函数

 2007-03-29 12:37:13 来源:WEB开发网   
核心提示: Python 不断发展的分裂性格Python 对函数编程(FP)的观点有点相互矛盾,一方面,使用 itertools 模块中的组合函数(2),许多 Python 开发人员轻视传统的 FP 函数 map() 、 filter() 和 reduce() ,常常建议使用“列表理解&r

Python 不断发展的分裂性格

Python 对函数编程(FP)的观点有点相互矛盾。一方面,许多 Python 开发人员轻视传统的 FP 函数 map() 、 filter() 和 reduce() ,常常建议使用“列表理解”来代替它们。但完整的 itertools 模块恰恰是由与这些函数类型完全相同的函数组成的,只不过这些函数对“惰性序列”(迭代器)操作,而不是对完整的序列(列表,元组)操作。而且,Python 2.3 中没有任何“迭代器理解”的语法,这似乎与列表理解拥有一样的动机。

我猜想 Python 最终会产生某种形式的迭代器理解,但这取决于找到合适于它们的自然语法。同时,在 itertools 模块中,我们拥有大量有用的组合函数。大致地,这些函数中的每一个都接受一些参数(通常包含一些基础迭代器)并返回一个新迭代器。例如,函数 ifilter() 、 imap() 和 izip() 都分别直接等同于缺少词首 i 的内置函数。

缺少的等价函数

itertools 中没有 ireduce() ,尽管按道理很自然地应该有这个函数;可能的 Python 实现是:

清单 1. ireduce() 的样本实现

def ireduce(func, iterable, init=None):
  if init is None:
    iterable = iter(iterable)
    curr = iterable.next()
  else:
    curr = init
  for x in iterable:
    curr = func(curr, x)
    yield curr

ireduce() 的用例类似于 reduce() 的用例。例如,假设您想要添加某个大型文件所包含的一列数字,但是当满足一个条件时就停止。您可以使用以下代码来监控正在计算的合计数:

清单 2. 添加并合计一列数

from operator import add
from itertools import *
nums = open('numbers')
for tot in takewhile(condition, ireduce(add, imap(int, nums)):
  print "total =", tot

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

Tags:使用 itertools 模块

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