对于您最初提出的将函数映射到输入序列对的问题,以下将起作用,并且在停留在 Python 领域时与它所获得的效率差不多。
from itertools import tee
a = range(10)
a1, a2 = tee(a)
a2.next()
b = map(someFunction, a1, a2)
至于需要访问上一次迭代结果的扩展问题——这种内部状态存在于函数概念展开中。但是 Python 不包含展开构造,并且出于充分的理由,循环在这种情况下更具可读性并且很可能也更快。至于让它更 Pythonic,我建议将成对迭代提升到一个函数并创建一个显式循环变量。
def pairwise(seq):
a, b = tee(seq)
b.next()
return izip(a, b)
def unfold_over_pairwise(unfolder, seq, initial):
state = initial
for cur_item, next_item in pairwise(seq):
state = unfolder(state, cur_item, next_item)
yield state
b = [something]
b.extend(unfold_over_pairwise(someFunction, a, initial=b[-1]))
如果循环开销确实是个问题,那么 someFunction 一定非常简单。在这种情况下,最好用更快的语言编写整个循环,例如 C。