โพรโทคอลตัววนซ้ำ
ทำความเข้าใจ __iter__ และ __next__
โพรโทคอลตัววนซ้ำ เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
การวนซ้ำคืออะไร
ทุกครั้งที่คุณเขียนลูป for ครอบลิสต์ สตริง หรือพจนานุกรม Python จะใช้โพรโทคอลการวนซ้ำอยู่เบื้องหลัง
อ็อบเจกต์ที่คุณสามารถวนซ้ำได้เรียกว่าสิ่งที่วนซ้ำได้ ส่วนสิ่งที่สร้างค่าทีละค่าเรียกว่าตัววนซ้ำ
for ch in 'abc':
print(ch)ฟังก์ชัน iter() และ next()
ฟังก์ชันในตัวสองรายการเป็นกลไกขับเคลื่อนการวนซ้ำ:
iter(obj)ขอให้สิ่งที่วนซ้ำได้ส่งตัววนซ้ำกลับมาnext(it)ขอค่าถัดไปจากตัววนซ้ำ
เมื่อไม่มีค่าเหลืออีกแล้ว next() จะทำให้เกิด StopIteration
it = iter([10, 20, 30])
print(next(it))
print(next(it))
print(next(it))StopIteration
การเรียกใช้ next() มากเกินไปหนึ่งครั้งจะทำให้เกิด StopIteration ลูป for จะจัดการกรณีนี้โดยอัตโนมัติและหยุดทำงานอย่างเรียบร้อย
it = iter([1])
print(next(it))
try:
next(it)
except StopIteration:
print('No more items')เมธอดขีดล่างคู่สองรายการ
หากต้องการสร้างตัววนซ้ำของคุณเอง คุณต้องนำเมธอดสองรายการไปใช้งาน:
__iter__ส่งคืนอ็อบเจกต์ตัววนซ้ำเอง__next__ส่งคืนค่าถัดไป หรือทำให้เกิดStopIteration
class Count:
def __init__(self, n):
self.i = 0
self.n = n
def __iter__(self):
return self
def __next__(self):
if self.i >= self.n:
raise StopIteration
self.i += 1
return self.i
for x in Count(3):
print(x)สิ่งที่วนซ้ำได้กับตัววนซ้ำ
สิ่งที่วนซ้ำได้ต้องมีเพียง __iter__ ส่วนตัววนซ้ำต้องมีทั้ง __iter__ และ __next__
ลิสต์เป็นสิ่งที่วนซ้ำได้แต่ไม่ใช่ตัววนซ้ำ การเรียกใช้ iter() แต่ละครั้งจะให้ตัววนซ้ำใหม่
nums = [1, 2, 3]
print(iter(nums) is iter(nums))
it = iter(nums)
print(it is iter(it))ตัววนซ้ำใช้ได้เพียงครั้งเดียว
ตัววนซ้ำสามารถถูกใช้จนหมดได้เพียงครั้งเดียว หลังจากถึงจุดสิ้นสุดแล้ว ตัววนซ้ำจะว่างเปล่าต่อไป หากต้องการวนซ้ำอีกครั้ง ให้สร้างตัววนซ้ำใหม่
it = iter([1, 2])
print(list(it))
print(list(it))ตัววนซ้ำคล้ายช่วง
มาสร้างตัววนซ้ำแบบกำหนดเองที่ทำงานคล้ายตัวนับอย่างง่ายกัน โปรดสังเกตว่าสถานะถูกเก็บไว้ในอินสแตนซ์
class EvenUpTo:
def __init__(self, limit):
self.cur = 0
self.limit = limit
def __iter__(self):
return self
def __next__(self):
if self.cur > self.limit:
raise StopIteration
value = self.cur
self.cur += 2
return value
print(list(EvenUpTo(8)))การแยกสิ่งที่วนซ้ำได้ออกจากตัววนซ้ำ
การออกแบบที่สะอาดขึ้นจะแยกโครงสร้างเก็บข้อมูลออกจากตัววนซ้ำ เพื่อให้สามารถวนซ้ำโครงสร้างเก็บข้อมูลนั้นได้หลายครั้ง
class Bag:
def __init__(self, items):
self.items = items
def __iter__(self):
return BagIterator(self.items)
class BagIterator:
def __init__(self, items):
self.items = items
self.i = 0
def __iter__(self):
return self
def __next__(self):
if self.i >= len(self.items):
raise StopIteration
v = self.items[self.i]
self.i += 1
return v
b = Bag(['x', 'y'])
print(list(b))
print(list(b))การใช้ next() พร้อมค่าเริ่มต้น
next(it, default) จะส่งคืนค่าเริ่มต้นแทนการทำให้เกิด StopIteration เมื่อตัววนซ้ำไม่มีค่าเหลือ เหมาะสำหรับการตรวจดูค่าถัดไปอย่างปลอดภัย
it = iter([42])
print(next(it, 'done'))
print(next(it, 'done'))ตัววนซ้ำใช้หน่วยความจำอย่างประหยัด
ตัววนซ้ำส่งคืนทีละรายการ จึงไม่จำเป็นต้องเก็บลำดับข้อมูลทั้งหมดไว้ในหน่วยความจำ ด้วยเหตุนี้จึงรองรับกระแสข้อมูลขนาดใหญ่มากหรือแม้แต่กระแสข้อมูลที่ไม่สิ้นสุดได้
class Naturals:
def __init__(self):
self.n = 0
def __iter__(self):
return self
def __next__(self):
self.n += 1
return self.n
it = iter(Naturals())
print(next(it), next(it), next(it))ฟังก์ชันในตัวที่ใช้ตัววนซ้ำ
ฟังก์ชันในตัวจำนวนมากรับตัววนซ้ำใด ๆ ได้ เช่น sum, max, min, sorted, list และ tuple ฟังก์ชันเหล่านี้จะดึงค่าไปเรื่อย ๆ จนพบ StopIteration
class Count:
def __init__(self, n):
self.i = 0
self.n = n
def __iter__(self):
return self
def __next__(self):
if self.i >= self.n:
raise StopIteration
self.i += 1
return self.i
print(sum(Count(5)))
print(max(Count(5)))ตรวจสอบอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับโพรโทคอลตัววนซ้ำ
ทบทวน
คุณได้เรียนรู้โพรโทคอลตัววนซ้ำแล้ว:
iter()ใช้รับตัววนซ้ำ ส่วนnext()ใช้ดึงค่าStopIterationใช้ส่งสัญญาณว่าสิ้นสุดแล้ว และforจะจัดการให้- ตัววนซ้ำแบบกำหนดเองจะใช้
__iter__และ__next__ - ตัววนซ้ำใช้ได้ครั้งเดียวและประหยัดหน่วยความจำ
ต่อไป คุณจะให้ Python เขียนตัววนซ้ำให้คุณด้วย yield
คำถามที่พบบ่อย
บทเรียน “โพรโทคอลตัววนซ้ำ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “โพรโทคอลตัววนซ้ำ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “โพรโทคอลตัววนซ้ำ”
ทำความเข้าใจ __iter__ และ __next__ คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “โพรโทคอลตัววนซ้ำ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม
ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ