Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python Iterator:A Guide

วิธีสร้าง 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 อย่างผู้เชี่ยวชาญแล้ว!