İşte itertools modül belgelerinden alakalı bir örnek :
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return zip(a, b)
Python 2 için ihtiyacınız itertools.izipyerine zip:
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return itertools.izip(a, b)
Bu nasıl çalışır:
İlk olarak, iki paralel yineleyiciler, ave b(oluşturulur tee()çağrı), orijinal iterable ilk elemana hem işaret. İkinci yineleyici, b1 adım ileri ( next(b, None)çağrı) taşınır . Bu noktada as0'ı gösterir ve bs1'i gösterir. Hem ave bbağımsız bir şekilde, orijinal yineleyici geçebilir - izip işlevi iki tekrarlayıcılara alır ve aynı hızda iki yineleyici ilerleyen dönen elemanların çiftleri yapar.
Bir uyarı: tee()İşlev, birbirinden bağımsız olarak ilerleyebilen iki yineleyici üretir, ancak bir bedeli vardır. Yineleyicilerden biri diğerinden daha fazla tee() ilerlerse, ikinci yineleyici de onları dinleyene kadar tüketilen öğeleri bellekte tutması gerekir (orijinal yineleyiciyi 'geri saramaz'). Burada önemli değil çünkü bir yineleyici diğerinden sadece 1 adım önde, ancak genel olarak bu şekilde çok fazla bellek kullanmak kolaydır.
Ve tee()bir nparametre alabildiğinden, bu aynı zamanda ikiden fazla paralel yineleyici için de kullanılabilir:
def threes(iterator):
"s -> (s0,s1,s2), (s1,s2,s3), (s2, s3,4), ..."
a, b, c = itertools.tee(iterator, 3)
next(b, None)
next(c, None)
next(c, None)
return zip(a, b, c)