นี่คือตัวอย่างที่เกี่ยวข้องจากเอกสารโมดูลitertools :
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 คุณต้อง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()
เรียก) ซึ่งทั้งสองชี้ไปที่องค์ประกอบแรกของการทำซ้ำดั้งเดิม ตัววนซ้ำตัวที่สองb
ถูกย้ายไปข้างหน้า 1 ก้าว (การnext(b, None)
) เรียก) ณ จุดนี้ชี้a
ไปที่ s0 และb
ชี้ไปที่ s1 ทั้งสองa
และb
สามารถสำรวจตัววนซ้ำดั้งเดิมได้อย่างอิสระ - ฟังก์ชัน izip รับตัววนซ้ำสองตัวและสร้างคู่ขององค์ประกอบที่ส่งคืนโดยเลื่อนตัววนซ้ำทั้งสองในจังหวะเดียวกัน
ข้อแม้อย่างหนึ่ง: 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)