อุปกรณ์เลือกเลื่อนของ Python

อุปกรณ์เลือกเลื่อนของ Python

อุปกรณ์เลือกเลื่อนเป็นวัตถุที่มีจำนวนค่าที่สามารถนับได้

อุปกรณ์เลือกเลื่อนเป็นวัตถุที่สามารถวนรอบ นั่นหมายความว่าคุณสามารถวนรอบทุกค่า

ในทางเทคนิค ใน Python อุปกรณ์เลือกเลื่อนเป็นวัตถุที่ปฏิบัติการตามกฎการวนรอบ มันมีวิธี __iter__() และ __next__()

อุปกรณ์เลือกเลื่อน VS วัตถุที่สามารถวนรอบ (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))

ปฏิบัติตัวอย่าง

วนรอบอุปกรณ์เลือกเลื่อน

เราก็สามารถใช้วนรอบ for บวกเพื่อวนรอบสิ่งที่สามารถวนรอบได้

ตัวอย่าง

วนรอบอิเล็กทอร์ ตามค่าในเตียม

mytuple = ("apple", "banana", "cherry")
for x in mytuple:
  print(x)

ปฏิบัติตัวอย่าง

ตัวอย่าง

วนรอบอิเล็กทอร์ (iterator) ตามตัวอักษรในซตริง

mystr = "banana"
for x in mystr:
  print(x)

ปฏิบัติตัวอย่าง

คำเตือน:for วนรอบจริงๆ สร้างอุปกรณ์เลือกเลื่อนวัตถุและทำการปฏิบัติการสำหรับวนรอบแต่ละตัว next() มีวิธีที่ชื่อ

สร้างอุปกรณ์เลือกเลื่อน

เพื่อที่จะสร้างวัตถุ/คลาสเป็นอุปกรณ์เลือกเลื่อน (iterator) ต้องทำการปฏิบัติการสร้างอุปกรณ์เลือกเลื่อน __iter__() และ __next__() มีวิธีที่ชื่อ

เหมือนที่คุณได้เรียนรู้ในบทวิชา Python คลาส/วัตถุ __init__() ฟังก์ชันที่อนุญาตให้คุณกระทำการเริ่มต้นบางอย่างขณะที่ทำการสร้างวัตถุ

__iter__() ฟังก์ชันที่มีความหมายเดียวกัน คุณสามารถทำการต่างๆ (ตั้งค่าเริ่มต้น และอื่น ๆ) แต่จำเป็นต้องคืนค่าตัวเองของอุปกรณ์ต่อไป

__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() ในรูปแบบนี้ตัวอย่างจะเลื่อนไปเป็นอย่างไม่มีจำกัด

เพื่อป้องกันการที่จะเลื่อนไปเป็นอย่างไม่มีจำกัด สามารถใช้คำสั่ง 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)

ปฏิบัติตัวอย่าง