Python Iterators
Python Iterators
ตัววนซ้ำเป็นวัตถุที่มีค่าจำนวนนับได้
ตัววนซ้ำเป็นอ็อบเจ็กต์ที่สามารถวนซ้ำได้ หมายความว่าคุณสามารถข้ามผ่านค่าทั้งหมดได้
ในทางเทคนิคแล้ว ใน Python ตัววนซ้ำเป็นอ็อบเจ็กต์ที่ใช้โปรโตคอลตัววนซ้ำ ซึ่งประกอบด้วยเมธอด__iter__()
และ__next__()
.
Iterator เทียบกับ Iterable
รายการ ทูเพิล พจนานุกรม และเซตเป็นอ็อบเจกต์ที่ทำซ้ำได้ทั้งหมด เป็น คอนเทนเนอร์แบบ iterable ซึ่งคุณสามารถใช้ iterator ได้
วัตถุทั้งหมดเหล่านี้มีiter()
วิธีที่ใช้ในการรับตัววนซ้ำ:
ตัวอย่าง
ส่งคืนตัววนซ้ำจากทูเพิล และพิมพ์แต่ละค่า:
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
แม้แต่สตริงก็เป็นอ็อบเจ็กต์ที่ทำซ้ำได้ และสามารถส่งคืนตัววนซ้ำได้:
ตัวอย่าง
สตริงยังเป็นอ็อบเจ็กต์ที่ทำซ้ำได้ ซึ่งมีลำดับของอักขระ:
mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
วนซ้ำผ่าน Iterator
นอกจากนี้เรายังสามารถใช้การfor
วนซ้ำเพื่อวนซ้ำผ่านวัตถุที่วนซ้ำได้:
ตัวอย่าง
วนซ้ำค่าของทูเพิล:
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
ตัวอย่าง
วนซ้ำอักขระของสตริง:
mystr = "banana"
for x in mystr:
print(x)
ลู ปfor
สร้างอ็อบเจ็กต์ iterator และรันเมธอด next() สำหรับแต่ละลูป
สร้างตัววนซ้ำ
ในการสร้างอ็อบเจ็กต์/คลาสเป็นตัววนซ้ำ คุณต้องใช้เมธอด
__iter__()
และ
__next__()
อ็อบเจ็กต์ของคุณ
ดังที่คุณได้เรียนรู้ในบทPython Classes/Objectsทุกคลาสมีฟังก์ชันที่เรียกว่า
__init__()
ซึ่งทำให้คุณสามารถเริ่มต้นบางอย่างได้เมื่อมีการสร้างอ็อบเจ็กต์
วิธี การ__iter__()
นี้ทำหน้าที่คล้ายกัน คุณสามารถดำเนินการได้ (กำลังเริ่มต้น ฯลฯ) แต่ต้องส่งคืนอ็อบเจ็กต์ iterator เองเสมอ
วิธี__next__()
นี้ยังช่วยให้คุณดำเนินการได้ และต้องส่งคืนรายการถัดไปตามลำดับ
ตัวอย่าง
สร้างตัววนซ้ำที่ส่งกลับตัวเลข เริ่มต้นด้วย 1 และแต่ละลำดับจะเพิ่มขึ้นทีละหนึ่ง (ส่งกลับ 1,2,3,4,5 เป็นต้น):
class MyNumbers:
def __iter__(self):
self.a =
1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
StopIteration
ตัวอย่างข้างต้นจะคงอยู่ตลอดไปหากคุณมีคำสั่ง next() เพียงพอ หรือถ้าใช้ใน
for
ลูป
เพื่อป้องกันไม่ให้การวนซ้ำเกิดขึ้นตลอดไป เราสามารถใช้
StopIteration
คำสั่งได้
ใน__next__()
เมธอดนี้ เราสามารถเพิ่มเงื่อนไขการสิ้นสุดเพื่อทำให้เกิดข้อผิดพลาด หากทำซ้ำตามจำนวนที่กำหนด:
ตัวอย่าง
หยุดหลังจากทำซ้ำ 20 ครั้ง:
class MyNumbers:
def __iter__(self):
self.a =
1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass =
MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)