itertools คืออะไร?
itertools คือ โมดูลมาตรฐาน (standard library) ของ Python ที่รวบรวมฟังก์ชันสำหรับ สร้าง iterators ที่มีประสิทธิภาพ (efficient iterators) หรือที่เรียกว่า "iterator building blocks" ซึ่งหมายความว่ามันไม่ได้สร้างลิสต์ทั้งหมดขึ้นมาในหน่วยความจำทันที แต่จะสร้างองค์ประกอบทีละตัวเมื่อมีการเรียกใช้ (lazy evaluation) ทำให้เหมาะสำหรับการจัดการกับข้อมูลขนาดใหญ่หรือลำดับที่ไม่มีที่สิ้นสุด
ทำไมต้องใช้ itertools
- ประสิทธิภาพด้านหน่วยความจำ (Memory Efficiency): เนื่องจาก itertools สร้างผลลัพธ์แบบทีละตัว (on-demand) มันจึงใช้หน่วยความจำน้อยกว่าการสร้างลิสต์ขนาดใหญ่ทั้งหมดในคราวเดียว ซึ่งสำคัญมากเมื่อทำงานกับข้อมูลจำนวนมหาศาล
- ประสิทธิภาพด้านความเร็ว (Performance): ฟังก์ชันใน itertools ถูกเขียนด้วยโค้ด C ที่ปรับปรุงมาอย่างดี ทำให้ทำงานได้เร็วกว่าการเขียนลูปด้วยตัวเองในหลายๆ กรณี
- ความกระชับของโค้ด (Code Conciseness): itertools มีฟังก์ชันที่ครอบคลุมงานทั่วไปเกี่ยวกับการวนซ้ำ ทำให้คุณเขียนโค้ดได้สั้นลงและอ่านง่ายขึ้น
- พลังในการรวมกัน (Combinatoric Power): ฟังก์ชันต่างๆ ใน itertools สามารถนำมาประกอบรวมกันเพื่อสร้างการทำงานที่ซับซ้อนได้อย่างน่าทึ่ง
itertools แบ่งฟังก์ชันออกเป็นกลุ่มใหญ่ๆ
1. Infinite Iterators (วนซ้ำไม่สิ้นสุด)
ฟังก์ชันเหล่านี้จะสร้างลำดับที่ไม่มีที่สิ้นสุด เหมาะสำหรับสถานการณ์ที่ต้องการการสร้างข้อมูลแบบต่อเนื่อง
count(start=0, step=1): สร้างลำดับตัวเลขที่เพิ่มขึ้นเรื่อยๆ
โค้ด: เลือกทั้งหมด
from itertools import count
for i in count(10, 2):
if i > 20:
break
print(i)
- count(start=10, step=2): เริ่มที่ 10 เพิ่มที่ละ 2
ผลลัพธ์ cycle(iterable): วนซ้ำองค์ประกอบใน iterable ไปเรื่อยๆ
โค้ด: เลือกทั้งหมด
from itertools import cycle
colors = ['red', 'green', 'blue']
count = 0
for color in cycle(colors):
if count >= 7:
break
print(color)
count += 1
โค้ด: เลือกทั้งหมด
from itertools import repeat
for i in repeat("Hello", 3):
print(i)
ฟังก์ชันเหล่านี้จะหยุดทำงานเมื่อ Input ใด Input หนึ่งหมด
chain(*iterables): รวมหลาย iterables เข้าด้วยกันเป็น iterable เดียว
โค้ด: เลือกทั้งหมด
from itertools import chain
list1 = [1, 2, 3]
list2 = ['a', 'b']
combined = chain(list1, list2)
print(list(combined))
โค้ด: เลือกทั้งหมด
from itertools import compress
data = ['A', 'B', 'C', 'D']
selectors = [True, False, True, False]
filtered = compress(data, selectors)
print(list(filtered))
โค้ด: เลือกทั้งหมด
from itertools import zip_longest
names = ['Alice', 'Bob']
ages = [25, 30, 35]
for name, age in zip_longest(names, ages, fillvalue='N/A'):
print(f"{name}: {age}")
ฟังก์ชันเหล่านี้มีประโยชน์มากสำหรับการสร้างชุดค่าผสม, การเรียงสับเปลี่ยน, และการเลือกกลุ่มย่อย
product(*iterables, repeat=1): สร้างผลคูณคาร์ทีเซียน (Cartesian product) ของ Input iterables คล้ายกับการใช้ Nested Loop
โค้ด: เลือกทั้งหมด
from itertools import product
# ลูกเต๋า 2 ลูก
rolls = product(range(1, 7), repeat=2)
print(list(rolls))
โค้ด: เลือกทั้งหมด
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6)]
ถ้า r ระบุไว้ จะสร้าง permutations ที่มีขนาด r
โค้ด: เลือกทั้งหมด
from itertools import permutations
letters = ['A', 'B', 'C']
perms = permutations(letters,3)
print(list(perms))
โดยเลือกมา r ตัว โดยไม่สนใจลำดับ (A, B เหมือนกับ B, A)
โค้ด: เลือกทั้งหมด
from itertools import combinations
numbers = [1, 2, 3, 4]
combs = combinations(numbers, 2) # เลือกมา 2 ตัว
print(list(combs))
filterfalse(predicate, iterable): ส่งคืนองค์ประกอบที่ predicate (ฟังก์ชันเงื่อนไข) เป็น False (ตรงข้ามกับ filter() ทั่วไป)
โค้ด: เลือกทั้งหมด
from itertools import filterfalse
numbers = [1, 2, 3, 4, 5, 6]
odd_numbers = filterfalse(lambda x: x % 2 == 0, numbers) # กรองเอาตัวเลขที่ไม่ใช่คู่ (คือเลขคี่)
print(list(odd_numbers))
itertools เป็นหนึ่งในโมดูลที่ทรงคุณค่าที่สุดใน Python สำหรับการจัดการกับข้อมูลวนซ้ำ คุณได้เห็นแล้วว่าฟังก์ชันต่างๆ ใน itertools ช่วยให้คุณสามารถสร้างลำดับข้อมูลได้หลากหลายรูปแบบ ไม่ว่าจะเป็นลำดับไม่สิ้นสุด การรวมลำดับ การสร้างชุดค่าผสม หรือการกรองข้อมูล ทั้งหมดนี้ล้วนทำได้อย่างมีประสิทธิภาพสูงและใช้หน่วยความจำน้อยลงอย่างมาก การทำความเข้าใจและนำ itertools ไปใช้จะมอบประโยชน์สำคัญ เช่น
- ยกระดับการเขียนโค้ด: คุณจะสามารถเขียนโค้ดที่กระชับ ชัดเจน และมีประสิทธิภาพมากขึ้น โดยเฉพาะเมื่อต้องจัดการกับข้อมูลจำนวนมากหรือการดำเนินการที่ซับซ้อน
- เพิ่มประสิทธิภาพแอปพลิเคชัน: การใช้ iterators ที่สร้างโดย itertools จะช่วยลดการใช้หน่วยความจำและปรับปรุงความเร็วในการประมวลผล ทำให้แอปพลิเคชันของคุณทำงานได้ดียิ่งขึ้น
อ้างอิง
- https://www.mindphp.com/บทเรียนออนไลน์/ ... ython.html
- https://www.mindphp.com/บทเรียนออนไลน์/ ... -type.html
- viewtopic.php?t=115050
- https://www.mindphp.com/บทเรียนออนไลน์/ ... ments.html
- viewtopic.php?t=104258