Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python Functions สร้าง iterators สำหรับการวนซ้ำอย่างมีประสิทธิภาพ


ในภาษาการเขียนโปรแกรมส่วนใหญ่ 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