使用 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]
更多精彩
赞助商链接