ในภาษาการเขียนโปรแกรมส่วนใหญ่ Python จัดเตรียมคำสั่ง while และ for เพื่อสร้างโครงสร้างแบบวนซ้ำ คำสั่ง for มีประโยชน์อย่างยิ่งในการข้ามผ่าน iterables เช่น list, tuple หรือ string เครื่องมือการวนซ้ำที่มีประสิทธิภาพและรวดเร็วยิ่งขึ้นถูกกำหนดไว้ในโมดูล itertools ของไลบรารีมาตรฐานของ Python โครงสร้างตัววนซ้ำเหล่านี้เป็นการนำเครื่องมือ Pythonic ไปใช้งานในภาษาการเขียนโปรแกรมที่ใช้งานได้ เช่น Haskell และ SML
ฟังก์ชันในโมดูล itertools มีสามประเภท
- ตัววนซ้ำไม่มีที่สิ้นสุด
- การวนซ้ำแบบจำกัด
- ตัววนซ้ำแบบผสมผสาน
ฟังก์ชันต่อไปนี้จะสร้างลำดับอนันต์
นับ() − ฟังก์ชันนี้ส่งคืนตัววนซ้ำของค่าที่เว้นระยะเท่ากันจากค่าเริ่มต้น ฟังก์ชันสามารถมีค่าขั้นตอนที่เป็นทางเลือกเพื่อเพิ่มค่าต่อเนื่องตามช่วงเวลานี้
>>> from itertools import count >>> for x in count(20): print (x) >>> for x in count(100,10): print (x)
คำสั่งแรกจะสร้างลำดับอนันต์เริ่มต้นจาก 20 และวินาทีจะสร้างตัวเลขจาก 100 พร้อมความถี่ในการก้าว 10 โปรดทราบว่าลูปไม่มีที่สิ้นสุดและจะไม่สิ้นสุดด้วยตัวเอง พวกเขาจะถูกยกเลิกเมื่อกด ctrl-C
รอบ() − ฟังก์ชันนี้เริ่มส่งคืนแต่ละองค์ประกอบจาก iterable ที่กำหนดและบันทึกสำเนาของมัน เมื่อองค์ประกอบหมดลง องค์ประกอบในสำเนาที่บันทึกไว้จะถูกส่งกลับจึงสร้างลูปไม่สิ้นสุด
>>> from itertools import cycle >>> for x in cycle("hello"): print (x)
อักขระในสตริงจะถูกพิมพ์ซ้ำๆ จนกว่าแป้นพิมพ์จะขัดจังหวะ Ctrl-C
ซ้ำ() − ฟังก์ชันนี้จะคืนค่าอาร์กิวเมนต์ของอ็อบเจ็กต์ซ้ำๆ หากระบุอาร์กิวเมนต์ที่สอง 'ครั้ง' การทำซ้ำจะเกิดขึ้นหลายครั้ง
>>> from itertools import repeat >>> for x in repeat(1): print (x) >>> for x in repeat('hello', 10): print (x)
วงแรกจะพิมพ์ 1 ไม่รู้จบ อันที่สองพิมพ์ 'สวัสดี' 10 ครั้ง
ฟังก์ชันในหมวดหมู่ต่อไปนี้จะส่งคืนตัววนซ้ำแบบจำกัดที่สิ้นสุดในลำดับอินพุตที่สั้นที่สุด
สะสม() − ฟังก์ชันนี้มีพารามิเตอร์สองตัว อันดับแรกคือ iterable (รายการ ทูเพิล หรือสตริง) พารามิเตอร์ที่สองโดยค่าเริ่มต้นคือ operator.add() (ฟังก์ชันในโมดูลตัวดำเนินการที่ใช้ตัวดำเนินการบวกมาตรฐาน) แต่อาจเป็นฟังก์ชันอื่นที่ได้รับพารามิเตอร์ตัวเลขสองตัว
accumulate(sequence, func)
สององค์ประกอบแรกของลำดับอินพุตถูกประมวลผลโดย func ผลลัพธ์ของกระบวนการคือพารามิเตอร์แรกสำหรับการวนซ้ำถัดไป และพารามิเตอร์ที่สองที่จะ func เป็นองค์ประกอบที่สามในลำดับอินพุต กระบวนการนี้ทำซ้ำจนกว่าลำดับจะหมด ฟังก์ชันสะสมส่งคืนตัววนซ้ำซึ่งแต่ละองค์ประกอบถูกสะสมผลลัพธ์จากการประมวลผลองค์ประกอบที่ต่อเนื่องกัน
ในตัวอย่างต่อไปนี้ ตัวเลขในรายการจะถูกเพิ่มแบบสะสม โปรดทราบว่าอาร์กิวเมนต์ของฟังก์ชันเริ่มต้นคือการเพิ่มการดำเนินการ
>>> from itertools import accumulate >>> list(accumulate([1,2,3,4,5])) [1, 3, 6, 10, 15]
เราสามารถกำหนดให้ผู้ใช้กำหนดฟังก์ชันเป็นพารามิเตอร์ที่สองเพื่อสะสม () ฟังก์ชัน
>>> def multiply(x,y): return x*y >>> list(accumulate([1,2,3,4,5], multiply)) [1, 2, 6, 24, 120]
ลักษณะการทำงานนี้ค่อนข้างคล้ายกับฟังก์ชัน reduce() ในตัว ฟังก์ชัน reduce() จะส่งกลับเฉพาะผลลัพธ์สุดท้ายของการสะสม ในขณะที่ collector() จะสร้างตัววนซ้ำของผลลัพธ์ขั้นกลางทั้งหมด
สายโซ่() − ฟังก์ชันนี้สามารถมีพารามิเตอร์ iterables ได้มากกว่าหนึ่งตัว มันให้ผลแต่ละองค์ประกอบของ iterable แรกในตัว iterator ที่เป็นผลลัพธ์และดำเนินการต่อไปจนกว่าพารามิเตอร์ iterable จะหมดลง
>>> from itertools import chain >>> list(chain([10,20],'hello',range(4))) [10, 20, 'h', 'e', 'l', 'l', 'o', 0, 1, 2, 3]
dropwhile() − ฟังก์ชันนี้ส่งคืนตัววนซ้ำโดยปล่อยองค์ประกอบจาก terable ตราบใดที่อาร์กิวเมนต์ของฟังก์ชันเพรดิเคตคืนค่าเป็นจริง ขณะที่ฟังก์ชันคืนค่าเท็จ องค์ประกอบที่เหลือทั้งหมดจะถูกส่งไปยังตัววนซ้ำ
>>> from itertools import dropwhile >>> def iseven(x): if x % 2 == 0: return True else: return False >>> list(dropwhile(iseven, [12,90,61,4,15])) [61, 4, 15]
filterfalse() − ฟังก์ชันนี้ส่งคืนตัววนซ้ำโดยกรององค์ประกอบที่ฟังก์ชันเพรดิเคตให้ผลลัพธ์เป็นเท็จ
>>> from itertools import filterfalse >>> def iseven(x): if x % 2 == 0: return True else: return False >>> list(filterfalse(iseven, [12,90,61,4,15])) [61, 15]
islice() − ฟังก์ชันนี้สร้างตัววนซ้ำโดยเลือกองค์ประกอบบางอย่างจาก iterable เกณฑ์การเลือกขึ้นอยู่กับพารามิเตอร์เริ่มต้น หยุด และขั้นตอน การเลือกเริ่มจากค่าเริ่มต้นและดำเนินต่อไปจนถึงค่าหยุด หากการหยุดเป็นไม่มี ค่านั้นจะไปถึงจุดสิ้นสุดของการวนซ้ำ มิฉะนั้น การเลือกจะหยุดที่ดัชนีที่ระบุ พารามิเตอร์ขั้นตอนคือ 1 โดยค่าเริ่มต้น การเลือกองค์ประกอบที่เพิ่มขึ้นตามพารามิเตอร์ขั้นตอน ไม่มีพารามิเตอร์ใดที่เป็นค่าลบได้
>>> from itertools import islice >>> list(islice(range(10),1,5,2)) [1, 3] >>> list(islice(range(10),0,None,3)) [0, 3, 6, 9] >>> list(islice(range(10),5,None)) [5, 6, 7, 8, 9] >>> list(islice(range(10),5)) [0, 1, 2, 3, 4]
ฟังก์ชันต่อไปนี้จะสร้างตัววนซ้ำแบบผสมจากออบเจกต์ที่ทำซ้ำได้
ผลิตภัณฑ์() − ฟังก์ชันนี้สร้างตัววนซ้ำซึ่งเป็นผลคูณคาร์ทีเซียนขององค์ประกอบในลำดับอินพุต ซึ่งเทียบเท่ากับการสร้างแบบซ้อนสำหรับลูป หนึ่งอันสำหรับการข้ามผ่านแต่ละลำดับที่ทำซ้ำได้
ในตัวอย่างต่อไปนี้ เทคนิคการทำความเข้าใจรายการจะใช้เพื่อเรียกใช้การวนซ้ำซ้อนสองครั้งในสองลำดับเพื่อสร้างผลิตภัณฑ์คาร์ทีเซียน
>>> [[x,y] for x in [1,2,3] for y in ['a','b','c']] [[1, 'a'], [1, 'b'], [1, 'c'], [2, 'a'], [2, 'b'], [2, 'c'], [3, 'a'], [3, 'b'], [3, 'c']]
ฟังก์ชัน product() ให้ผลลัพธ์ที่คล้ายกัน
>>> from itertools import product >>> list(product([1,2,3],['a','b','c'])) [(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]
การเรียงสับเปลี่ยน() − ฟังก์ชันนี้ให้ผลการเรียงสับเปลี่ยนขององค์ประกอบที่เป็นไปได้ทั้งหมดในอินพุตแบบวนซ้ำได้ ความยาวของการเปลี่ยนแปลงแต่ละครั้งอาจถูกระบุเป็นพารามิเตอร์ที่สองของฟังก์ชันนี้ หากไม่ระบุ ความยาวเป็นหนึ่ง
>>> list(permutations(range(1,4),2)) [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
ชุดค่าผสม() − ฟังก์ชันนี้ให้ผลรวมขององค์ประกอบที่เป็นไปได้ทั้งหมดในอินพุตที่ทำซ้ำได้ ความยาวของการเปลี่ยนแปลงแต่ละครั้งอาจถูกระบุเป็นพารามิเตอร์ที่สองของฟังก์ชันนี้ หากไม่ระบุ ความยาวเป็นหนึ่ง
>>> from itertools import combinations >>> list(combinations(range(1,4),2)) [(1, 2), (1, 3), (2, 3)]
บทความนี้จะแนะนำเครื่องมือ iterator ต่างๆ ที่กำหนดไว้ในโมดูล itertools ของไลบรารี Python