วิธีสร้าง Python Iterator:คำแนะนำ
Iterators มีอยู่ทั่วไปใน Python; เป็นการยากที่จะเรียนรู้แม้แต่พื้นฐานโดยไม่ได้ยินคำว่า "iterator" หรือ "iterable"
iterator เป็นวัตถุที่สามารถวนซ้ำได้ แม้ว่าจะมีบางอ็อบเจ็กต์ในตัวที่คุณสามารถทำซ้ำได้ คุณยังสามารถกำหนดออบเจ็กต์ของคุณเองได้
ในคู่มือนี้ เราจะพูดถึง Python iterators ว่ามันทำงานอย่างไร และคุณสามารถใช้มันในโค้ดของคุณได้อย่างไร เราจะสร้างตัววนซ้ำของเราเองเพื่อให้คุณสามารถเรียนรู้เกี่ยวกับคุณสมบัติหลักของพวกเขาในการใช้งานจริง โค้ดในคู่มือนี้ใช้ได้กับการติดตั้ง Python 3.x
เริ่มกันเลย!
ตัววนซ้ำคืออะไร
Iterators เป็นวัตถุที่คุณสามารถทำซ้ำได้ ตัววนซ้ำจะส่งคืนข้อมูลจากวัตถุนั้นทีละรายการ
คุณสามารถตรวจสอบว่าอ็อบเจ็กต์สามารถทำซ้ำได้หรือไม่โดยพยายามเรียกใช้ผ่าน for loop; ถ้าคุณสามารถวนซ้ำอ็อบเจกต์ได้ แสดงว่าสามารถวนซ้ำได้ สตริง รายการ ทูเพิล และพจนานุกรมเป็นตัวอย่างของชนิดข้อมูลที่มีอยู่แล้วภายในซึ่งเป็นอ็อบเจ็กต์ที่ทำซ้ำได้
วัตถุ iterator ใน Python ต้องมีสองวิธี:
__iter__()
:สิ่งนี้ทำให้คุณสามารถดึงข้อมูลตัววนซ้ำได้__next__()
:สิ่งนี้ช่วยให้คุณได้รับค่าถัดไปในตัววนซ้ำ
__
ขีดล่างถูกใช้ในตัววนซ้ำเนื่องจากแสดงถึงฟังก์ชันพิเศษ ในการกำหนดตัววนซ้ำ คุณต้องใช้ฟังก์ชันพิเศษทั้งสองนี้ รวมกันเรียกว่าโปรโตคอลตัววนซ้ำ วิธีการเหล่านี้มักจะออกเสียงว่า “วิธี iter และวิธีถัดไป”
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
วิธีสร้างตัววนซ้ำที่ไม่มีที่สิ้นสุด
เราจะเริ่มต้นด้วยพื้นฐาน:การสร้างตัววนซ้ำที่ไม่สิ้นสุด นี่คือตัววนซ้ำประเภทที่ง่ายที่สุด มันง่ายมากที่จะดำเนินต่อไปตลอดไป เราจะแก้ไขปัญหานี้ในภายหลังในบทช่วยสอน
เริ่มต้นด้วยการกำหนดคลาสที่เรียกว่า Cakes ซึ่งจะเป็นคลาส iterator ของเรา:
class Cakes: def __init__(self, value): self.value = value
เราได้ประกาศ __init__
เมธอดที่จะดำเนินการทันทีที่วัตถุของคลาสของเราสร้างอินสแตนซ์ __init__
วิธีการเรียกว่าตัวสร้าง ในตัวอย่างนี้ __init__
. ของเรา เมธอดสามารถรับค่าได้หนึ่งค่า:ค่า
ต่อไป เราจะสร้างโปรโตคอลตัววนซ้ำของเรา:
def __iter__(self): return self def __next__(self): return self.value
__iter__
วิธีการใช้เพื่อดึงวัตถุ iterator ของเรา __next__
วิธีช่วยให้เราสามารถดึงค่าถัดไปในวัตถุ iterable ที่เราระบุ
ตรวจสอบให้แน่ใจว่าโค้ดของเราใช้งานได้จนถึงตอนนี้ เราจะทำอย่างนั้นโดยกำหนดวัตถุของชั้นเรียนดังนี้:
cake = Cakes(["Vanilla Sponge"])
จนถึงตอนนี้ดีมาก! คุณอาจกำลังคิดกับตัวเอง:ทำไมรหัสนี้ไม่ทำอะไรเลย? นั่นเป็นเพราะคลาสของเราส่งคืนฟังก์ชันตัววนซ้ำเท่านั้น
เราต้องวนซ้ำบน iterator ของเราเพื่อตรวจสอบว่าทำงานได้หรือไม่ เราสามารถทำได้โดยใช้ for-in loop:
for c in cake: print(c)
รหัสของเราส่งคืน:
Vanilla Sponge Vanilla Sponge …
คำสาปของวนิลาสปอนจ์! มันยังคงถูกพิมพ์ไปยังคอนโซล เกิดอะไรขึ้น? เราเพิ่งสร้างตัววนซ้ำครั้งแรกของเรา มันง่ายมาก แต่ใช้งานได้
การทดสอบตัววนซ้ำโดยใช้ for-in ลูปใน Python
ก่อนที่เราจะทำให้ iterator มีประโยชน์ เรามาทบทวนแนวคิดของ for-in loop เสียก่อน ในตัวอย่างที่แล้ว เราเขียน for-in loop เพื่อทดสอบโค้ดของเรา:
for c in cake: print(c)
วิธีการทำงานของลูป for-in คือขั้นแรกสร้างตัววนซ้ำของอ็อบเจ็กต์โดยใช้ __iter__()
กระบวนการ. วง for-in เรียก __next__()
จนกว่าจะไม่มีค่ากลับคืนมา
คุณสามารถนึกถึง for-in
วนซ้ำอย่างง่าย while
ห่วง แม้ว่าจะมีค่าที่ iterator สามารถส่งคืนได้ แต่ for-in loop จะคืนค่าเหล่านั้น
การสร้าง Iterator ที่มีประโยชน์
ตัววนซ้ำล่าสุดของเราไม่มีประโยชน์มาก เพียงพิมพ์ค่าเดิมซ้ำแล้วซ้ำอีก จากที่กล่าวมา มันยังคงเป็นตัววนซ้ำ:มันสามารถอ่านวัตถุทั้งหมดในการวนซ้ำได้
เราจะสร้างตัววนซ้ำที่วนซ้ำบนอาร์เรย์ Python อาร์เรย์นี้มีรายการเค้ก
เพื่อป้องกันไม่ให้ iterator ของเราทำซ้ำไปเรื่อย ๆ เราจะติดตามว่ามีกี่ค่าที่อยู่ใน iterable ของเรา และ iterator ของเราดำเนินการกี่ครั้ง ซึ่งจะทำให้เราสามารถหยุดการทำงานของ iterator เมื่อมีการทำซ้ำผ่านรายการทั้งหมดใน iterable
เปิดไฟล์ Python ใหม่แล้ววางในโค้ดต่อไปนี้:
class Cakes: def __init__(self, value): self.value = value self.max = len(value) self.count = 0 def __iter__(self): return self def __next__(self): if self.count < self.max: to_return = self.value[self.count] self.count += 1 return to_return else: raise StopIteration
ตัววนซ้ำนี้ซับซ้อนกว่าตัวที่แล้วเล็กน้อย นั่นเป็นเหตุผลที่เราสร้างตัววนซ้ำแบบไม่สิ้นสุดก่อน ในตัววนซ้ำนี้ เราได้เริ่มต้นสามค่า:
- value:รายการที่เราต้องการทำซ้ำ
- สูงสุด:จำนวนรายการใน iterable ของเรา
- นับ:จำนวนครั้งที่ตัวทำซ้ำของเราดำเนินการ
ใน __next__()
. ของเรา วิธีการ เราได้เพิ่มคำสั่ง ”ถ้า” คำสั่งนี้จะตรวจสอบว่าจำนวนครั้งที่ตัววนซ้ำของเราทำงาน (นับ) น้อยกว่าจำนวนรายการที่ iterable ของเราควรทำซ้ำ (สูงสุด) หรือไม่
หาก "จำนวน" น้อยกว่า "สูงสุด" ตัววนซ้ำของเราจะค้นหาค่าถัดไปในวัตถุที่ทำซ้ำได้ จากนั้นจะเพิ่ม 1 ลงในตัวแปร "การนับ" ของเรา เพื่อให้เราสามารถติดตามจำนวนอ็อบเจ็กต์ที่เหลือที่จะวนซ้ำ จากนั้นเราจะคืนค่าที่เราคำนวณ
สิ่งสำคัญคือต้องสังเกตว่าเรากำหนดค่าให้กับตัวแปร "to_return" ก่อนที่เราจะเพิ่มตัวแปร "นับ" เพื่อให้แน่ใจว่าเราสามารถเข้าถึงค่าในการวนซ้ำปัจจุบันของ iterator ของเราได้
หากเราทำซ้ำทุกรายการในรายการของเรา ข้อยกเว้นจะเรียกว่า StopIteration สิ่งนี้จะหยุดโปรแกรมของเราเมื่อเราทำซ้ำทุกรายการในรายการแล้ว
มาดูกันว่าตัววนซ้ำของเราทำงานได้หรือไม่ เพิ่มรหัสต่อไปนี้ในโปรแกรมหลักของคุณและดำเนินการ:
cake = Cakes(["Vanilla Sponge"]) for c in cake: print(c)
รหัสของเราส่งคืน:
Vanilla Sponge
มาเพิ่มอีกสองสามรายการในรายการของเราและดูว่าเกิดอะไรขึ้น:
cake = Cakes(["Vanilla Sponge", "Carrot", "Coffee"]) for c in cake: print(c)
รหัสของเราส่งคืน:
Vanilla Sponge Carrot Coffee
เราทำได้! เราได้สร้างตัววนซ้ำที่วนรอบรายการเค้กของเราสำเร็จแล้ว คุณคู่ควรกับเค้กหรือแม้กระทั่งคัพเค้กสำหรับการมาไกลขนาดนี้
บทสรุป
ตัววนซ้ำช่วยให้คุณสร้างวัตถุที่สามารถวนซ้ำได้ ตัววนซ้ำสามารถวนซ้ำผ่านรายการ สตริง หรืออ็อบเจ็กต์ที่ทำซ้ำได้อื่นๆ และดำเนินการบางอย่าง
คุณพร้อมสำหรับความท้าทายหรือไม่? สร้างตัววนซ้ำที่วนซ้ำผ่านรายการตัวเลขและส่งกลับแต่ละหมายเลขคูณด้วยสอง
โค้ดสำหรับ iterator นี้จะคล้ายกับตัวอย่างข้างต้นของเรา - จะยังคงใช้โปรโตคอล iterator - แต่ควรคูณตัวเลขแต่ละรายการในรายการด้วยสองก่อนที่จะกลับสู่โปรแกรมหลัก
ตอนนี้คุณพร้อมที่จะเริ่มเขียน iterators ของคุณเองใน Python อย่างผู้เชี่ยวชาญแล้ว!