इटर्स्टस मॉड्यूल डॉक्स से एक प्रासंगिक उदाहरण यहां दिया गया है :
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return zip(a, b)
अजगर 2 के लिए, आपको itertools.izipइसके बजाय चाहिए 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)
यह कैसे काम करता है:
सबसे पहले, दो समानांतर चलने वाले, aऔर bबनाए गए ( tee()कॉल), दोनों मूल चलने वाले के पहले तत्व की ओर इशारा करते हैं। दूसरा पुनरावृत्त, b1 कदम आगे ( next(b, None)) कॉल को स्थानांतरित किया जाता है । इस बिंदु aपर s0 को bइंगित करता है और s1 को इंगित करता है। दोनों aऔर bमूल इटरेटर स्वतंत्र रूप से पार कर सकते हैं - izip समारोह दो iterators लेता है और वापस आ तत्वों की जोड़ी, एक ही गति से दोनों iterators को आगे बढ़ाने में आता है।
एक चेतावनी: tee()फ़ंक्शन दो पुनरावृत्तियों का उत्पादन करता है जो एक दूसरे से स्वतंत्र रूप से आगे बढ़ सकते हैं, लेकिन यह एक लागत पर आता है। यदि पुनरावृत्तियों में से एक दूसरे से आगे बढ़ता है, तोtee() पुनरावृत्तियों में भस्म तत्वों को स्मृति में रखने की आवश्यकता है जब तक कि दूसरा पुनरावृत्ति उन्हें भी वापस कर देता है (यह मूल पुनरावृत्ति को 'रिवाइंड' नहीं कर सकता)। यहाँ यह कोई फर्क नहीं पड़ता क्योंकि एक पुनरावृत्त दूसरे से केवल 1 कदम आगे है, लेकिन सामान्य तौर पर इस तरह से बहुत सारी मेमोरी का उपयोग करना आसान है।
और चूंकि tee()एक nपैरामीटर लिया जा सकता है, इसका उपयोग दो से अधिक समानांतर चलने वालों के लिए भी किया जा सकता है:
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)