0Pricing
Python Academy · บทเรียน

โพรโทคอลตัววนซ้ำ

ทำความเข้าใจ __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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โพรโทคอลตัววนซ้ำ
  2. ฟังก์ชันเจเนอเรเตอร์
  3. นิพจน์เจเนอเรเตอร์
  4. yield from และการมอบหมายงาน
← กลับไปที่ Python Academy