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

使用 itertools 模块中的组合函数

 2007-03-29 12:37:13 来源:WEB开发网   
核心提示: 深入探讨itertools 中包含的函数是一个很好的开始,不使用其它函数,使用 itertools 模块中的组合函数(5),只用这些函数就可以让 Python 程序员更轻松地利用和组合迭代器,一般说来,您还可以通过使它们分散排列来组合几个序列,还没有任何对序列执行这样相同操作的内置语法,迭

深入探讨

itertools 中包含的函数是一个很好的开始。不使用其它函数,只用这些函数就可以让 Python 程序员更轻松地利用和组合迭代器。一般说来,迭代器的广泛使用对 Python 的未来无疑是很重要的。但是除了过去所包含的内容以外,我还要对该模块的将来更新提几点建议。您可以立即很方便地使用这些函数 - 当然,如果它们是后来被包含进来的,那么名称或接口细节会有所不同。

一种可能会很通用的类别是一些将多个 iterable 作为参数,随后从每个 iterable 产生单独元素的函数。与此相对照的是, izip() 产生元素元组,而 imap() 产生从基本元素计算而来的值。我头脑中很清晰的两个安排是 chain() 和 weave() 。第一个在效果上类似于序列并置(但是有点惰性)。即,在您可能使用的纯序列中,例如:

for x in ('a','b','c') + (1, 2, 3):
  do_something(x)

对于一般的 iterables,您可以使用:

for x in chain(iter1, iter2, iter3):
  do_something(x)

Python 实现是:

清单 3. chain() 的样本实现

def chain(*iterables):
  for iterable in iterables:
    for item in iterable:
      yield item

使用 iterables,您还可以通过使它们分散排列来组合几个序列。还没有任何对序列执行这样相同操作的内置语法,但是 weave() 本身也非常适用于完整的序列。下面是可能的实现(Magnus Lie Hetland 提出了 comp.lang.python 的类似函数):

清单 4. weave() 的样本实现

def weave(*iterables):
  "Intersperse several iterables, until all are exhausted"
  iterables = map(iter, iterables)
  while iterables:
    for i, it in enumerate(iterables):
      try:
        yield it.next()
      except StopIteration:
        del iterables[i]

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

Tags:使用 itertools 模块

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