很长一段时间我都使用 itertools 食谱中的成对函数。 ( https://docs.python.org/3.4/library/itertools.html#itertools-recipes )
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
但这不是总是给出与 zip(iterable, iterable[1:]) 相同的结果吗?
zip(iterable, iterable[1:])
只适用于可以切片的东西。 pairwise
适用于任意可迭代对象。
为了演示,这是斐波那契数列的典型函数式无限列表(此处为生成器)的极其复杂的版本:
from itertools import tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
def cons(x, xs):
yield x
yield from xs
def take(count, l):
it = iter(l)
for i in range(count):
yield next(it)
def lazy_yield_from(get_iterable):
yield from get_iterable()
infinite_fibonacci, _if = tee(
cons(1, cons(1, lazy_yield_from(lambda: (a + b for a, b in pairwise(_if))))))
print(list(take(5, infinite_fibonacci)))
我是一名优秀的程序员,十分优秀!