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

วิธีการเขียน Python Generator

ตัววนซ้ำมีบทบาทสำคัญใน Python สิ่งเหล่านี้ช่วยให้คุณสร้างวัตถุที่สามารถทำซ้ำได้ เป็นวิธีที่ดีในการจัดเก็บข้อมูลที่สามารถเข้าถึงได้ผ่าน for in loop

ปัญหาเกี่ยวกับ iterators คือต้องใช้ความพยายามอย่างมากในการสร้าง มีประโยชน์ แต่คุณต้องเขียนโค้ดจำนวนมากเพื่อให้ใช้งานได้ เครื่องกำเนิดไฟฟ้าช่วยแก้ปัญหานี้

ในคู่มือนี้ เราจะพูดถึงว่าเครื่องกำเนิด Python คืออะไร และเหตุใดคุณจึงควรใช้ เราจะใช้ตัวสร้างใน Python เพื่อช่วยให้คุณเข้าใจวิธีการทำงาน

เพื่อไม่ให้เป็นการเสียเวลา มาเริ่มกันเลย!

เครื่องกำเนิดคืออะไร

เครื่องกำเนิดไฟฟ้าเป็นวิธีง่ายๆ ในการสร้างตัววนซ้ำใน Python เป็นฟังก์ชันที่ส่งคืนอ็อบเจ็กต์ซึ่งคุณสามารถวนซ้ำได้

เครื่องกำเนิดไฟฟ้ามักเรียกว่าน้ำตาลวากยสัมพันธ์ เนื่องจากไม่จำเป็นต้องเพิ่มฟังก์ชันการทำงานใหม่ลงใน Python ช่วยทำให้โค้ดของคุณมีประสิทธิภาพมากขึ้น

เช่นเดียวกับตัววนซ้ำ คุณสามารถวนซ้ำได้บนตัวสร้างเพียงครั้งเดียว เนื่องจากตัวสร้างจะติดตามจำนวนครั้งที่ทำซ้ำและไม่สามารถรีเซ็ตได้

มาดู Python iterator กัน:

81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้

ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก

class Cookies:
	def __init__(self, value):
		self.value = value

	def __iter__(self):
		return self

	def __next__(self):
		return self.value

รหัสนี้สร้างตัววนซ้ำที่เรียกว่าคุกกี้ เมื่อคุณส่งข้อมูลผ่านตัววนซ้ำนี้ ข้อมูลนั้นจะกลายเป็นวัตถุที่ทำซ้ำได้ ซึ่งหมายความว่าคุณสามารถวนซ้ำข้อมูลโดยใช้ for ในลูป หากคุณกำลังดูโค้ดนี้และคิดว่ามันยาวมาก นั่นก็เพราะว่าเป็นเช่นนั้น

เครื่องกำเนิดไฟฟ้าสามารถช่วยเราย่อรหัสนี้ให้สั้นลง มาเขียนตัวสร้างสำหรับตัววนซ้ำด้านบนของเรา:

def cookies(value):
	while True:
		yield value

รหัสของเราลดขนาดลงอย่างมาก มาพูดคุยกันว่ามันทำงานอย่างไร

ตัวสร้างเป็นฟังก์ชันที่มีคีย์เวิร์ดให้ผลตอบแทนแทนที่จะเป็นคำสั่งส่งคืน คำสั่งผลตอบแทนส่งกลับค่าจากฟังก์ชัน

ความแตกต่างระหว่างคำสั่งผลตอบแทนและคำสั่งส่งคืนคือคำสั่ง return หยุดการทำงานของฟังก์ชันในขณะที่คำสั่งผลตอบแทนหยุดการทำงานชั่วคราวและดำเนินการซ้ำ

มาลองทำซ้ำฟังก์ชันตัวสร้างอย่างง่ายของเรากัน:

for cookie in cookies("Raspberry"):
	print(cookie)

รหัสของเราส่งคืน:

ราสเบอร์รี่

ราสเบอร์รี่


รหัสนี้ทำซ้ำจนกว่าเราจะหยุดโปรแกรมของเรา นี่เป็นเพราะว่าเราใช้ while วนซ้ำซึ่งดำเนินการตลอดไป สิ่งนี้ไม่มีประโยชน์มากในกรณีส่วนใหญ่ มาเขียนตัวสร้างที่หยุดเมื่อมีการดำเนินการ

วิธีการเขียน Python Generator

เรามีรายการคุกกี้ที่เราต้องการพิมพ์ไปยังคอนโซล รายการนี้มีลักษณะดังนี้:

[“Raspberry”, “Choc-Chip”, “Cinnamon”, “Oat”]

หากต้องการพิมพ์สิ่งเหล่านี้ไปยังคอนโซล เราสามารถสร้างตัวสร้างอย่างง่ายได้ เปิดไฟล์ Python ใหม่แล้ววางในรหัสต่อไปนี้:

def print_cookies(cookies):
	length = len(cookies)
	for cookie in range(0, length):
yield cookies[cookie]

โปรแกรมสร้างของเราจะตรวจสอบทุกคุกกี้ในรายการที่เราระบุและส่งคืนคุกกี้แต่ละรายการแยกกัน เครื่องกำเนิดไฟฟ้านี้ยังไม่ทำงาน เราต้องใช้ for loop เพื่อวนซ้ำ:

cookie_list = ["Raspberry", "Choc-Chip", "Cinnamon", "Oat"]

for c in print_cookies(cookie_list):
	print(c)

เราได้กำหนดอาร์เรย์ที่เรียกว่า cookie_list ซึ่งจัดเก็บรายการคุกกี้สี่รายการ จากนั้นเราได้ตั้งค่า for loop ซึ่งใช้ตัวสร้างของเราเพื่อวนซ้ำค่าใน cookie_list .

สำหรับการวนซ้ำแต่ละครั้งใน for loop ของเรา ออบเจ็กต์ที่สร้างขึ้นจะถูกพิมพ์ไปยังคอนโซล:

ราสเบอร์รี่

ช็อกชิพ

อบเชย

ข้าวโอ๊ต

เราทำได้! ตัวสร้างนี้คืนค่าจนกระทั่งแต่ละค่าในตัวแปร cookie_list ได้รับการทำซ้ำมากกว่า

เครื่องกำเนิดไฟฟ้ามีกรณีการใช้งานที่หลากหลาย สมมติว่าเรามีรายการราคาสั่งซื้อที่เราต้องการรวม เราสามารถทำได้โดยใช้รหัสต่อไปนี้:

def total_orders(orders):
	length = len(orders)
	total = 0
	for o in range(0, length):
		total += orders[o]
		yield total

โปรแกรมสร้างนี้จะเก็บมูลค่ารวมของคำสั่งซื้อทั้งหมดไว้ในรายการ หลังจากที่แต่ละรายการได้รับการทำซ้ำแล้ว เครื่องกำเนิดจะให้มูลค่ารวมปัจจุบันของคำสั่งซื้อ มาเขียน for loop ซึ่งใช้ตัวสร้างของเรา:

order_list = [2.30, 2.50, 1.95, 6.00, 7.50, 2.15]

for order in total_orders(order_list):
	print(order)

รหัสของเราส่งคืน:

2.3

4.8

6.75

12.75

20.25

22.4

ตัวสร้างของเราได้คำนวณมูลค่าสะสมของคำสั่งทั้งหมดในตัวแปร order_list การวนซ้ำทุกครั้งในรายการจะส่งกลับค่าสะสมใหม่

วิธีเขียนนิพจน์ตัวสร้าง

ตัวสร้างนั้นเขียนง่ายกว่าตัววนซ้ำอยู่แล้ว การแสวงหาของเราในการเขียนโค้ดที่สะอาดยิ่งขึ้นไม่จำเป็นต้องหยุดลง ด้วยนิพจน์ของตัวสร้าง

นิพจน์ตัวสร้างจะคล้ายกับรายการความเข้าใจ นิพจน์ตัวสร้างจะสร้างรายการครั้งละหนึ่งรายการ เช่นเดียวกับตัวสร้าง ซึ่งแตกต่างจากความเข้าใจรายการที่สร้างรายการทั้งหมด ทั้งหมดในครั้งเดียว

มาเขียนตัวสร้างสำหรับตัวอย่างคุกกี้ของเรา:

cookie_list = ["Raspberry", "Choc-Chip", "Cinnamon", "Oat"]

cookie_generator = (cookie for cookie in cookie_list)

เราได้กำหนดรายการคุกกี้ในตัวแปร cookie_list . จากนั้นเราสร้างนิพจน์ตัวสร้าง นิพจน์นี้ใช้ไวยากรณ์สำหรับการเข้าใจรายการ แต่มีความแตกต่างใหญ่อย่างหนึ่ง:ความเข้าใจรายการถูกกำหนดภายในวงเล็บเหลี่ยม ในขณะที่ตัวสร้างถูกกำหนดภายในวงเล็บเหลี่ยม

มาสร้าง for loop ที่วนซ้ำนิพจน์:

for cookie in cookie_generator:
	print(cookie)

รหัสของเราส่งคืน:

ราสเบอร์รี่

ช็อกชิพ

อบเชย

ข้าวโอ๊ต

การตอบสนองของตัวสร้างนี้เหมือนกับจากตัวอย่างแรกของเรา ไวยากรณ์ของเรามีความชัดเจนมากขึ้น

สิ่งสำคัญคือต้องสังเกตว่าเมื่อคุณวนซ้ำบนตัวสร้างที่ถูกประกาศโดยใช้นิพจน์ตัวสร้าง คุณจะไม่เรียกว่าเป็นฟังก์ชัน cookie_generatorของเรา เครื่องกำเนิดไม่ยอมรับค่าอินพุตใด ๆ :มีรหัสที่ต้องทำซ้ำใน cookie_list แล้ว รายการ.

คุณควรใช้ไวยากรณ์นิพจน์ตัวสร้างเฉพาะเมื่อคุณต้องการเขียนตัวสร้างที่ทำหน้าที่อย่างง่ายเท่านั้น การพิมพ์รายการค่าเป็นตัวอย่างที่ดี การคูณค่าในรายการด้วยจำนวนเฉพาะเป็นอีกตัวอย่างที่ดี

เนื่องจากในขณะที่ไวยากรณ์นิพจน์ของตัวสร้างมีความชัดเจน แต่ได้รับการออกแบบมาสำหรับนิพจน์บรรทัดเดียวเป็นหลัก หากตัวสร้างของคุณจะใช้โค้ดมากกว่าหนึ่งบรรทัด ให้เขียนมันเป็นฟังก์ชันตัวสร้างโดยใช้ไวยากรณ์ที่เราพูดถึงก่อนหน้านี้ในบทความนี้

เหตุใดจึงใช้เครื่องกำเนิดไฟฟ้า

เหตุผลหลักที่ใช้ตัวสร้างคือมีความกระชับมากกว่าตัววนซ้ำ

เครื่องกำเนิดไฟฟ้าเป็นเหมือนฟังก์ชันและไม่จำเป็นต้องมีคำสั่ง __init__, __iter__ หรือ __next__ เพื่อทำงาน ซึ่งไม่เหมือนกับตัววนซ้ำที่ต้องการทั้งสามประโยค ลักษณะการทำงานนี้หมายความว่าคุณสามารถใช้ตัวสร้างในโค้ดน้อยกว่าที่คุณทำได้หากคุณกำลังเขียนตัววนซ้ำ

ยิ่งไปกว่านั้น เครื่องกำเนิดไฟฟ้ายังใช้หน่วยความจำได้อย่างมีประสิทธิภาพอีกด้วย เครื่องกำเนิดไฟฟ้าผลิตได้ครั้งละหนึ่งรายการเท่านั้น พวกเขาไม่ได้สร้างลำดับทั้งหมดในหน่วยความจำก่อนที่จะส่งกลับผลลัพธ์ สิ่งนี้ทำให้ตัวสร้างใช้งานได้จริงมาก หากคุณต้องการทำซ้ำรายการข้อมูลจำนวนมาก

วิธีทำงานคือตัววนซ้ำใช้วิธีการประเมินแบบขี้เกียจ พวกเขาสร้างองค์ประกอบถัดไปของวัตถุ iterable เมื่อมีการร้องขอรายการนั้นเท่านั้น

บทสรุป (และความท้าทาย)

ตัวสร้างช่วยให้คุณสร้างตัววนซ้ำ Pythonic ได้มากขึ้น

ตัวสร้างทำให้ง่ายต่อการเขียนวัตถุโดยใช้โปรโตคอล iterator โดยไม่ต้องเขียนคำสั่ง __init__, __iter__ หรือ __next__ เครื่องกำเนิดไฟฟ้าถูกกำหนดให้เป็นฟังก์ชัน พวกเขาใช้คำสั่งผลตอบแทนเพื่อหยุดตัวสร้างและส่งค่ากลับไปที่โปรแกรมหลักก่อนที่จะกลับสู่การทำงานปกติ

หากคุณกำลังมองหาความท้าทาย นี่คือแนวคิดบางประการ:

  • เขียนตัวสร้างที่กลับสตริง
  • เขียนตัวสร้างที่ส่งกลับเฉพาะค่าที่มีคำเฉพาะจากรายการค่า
  • เขียนตัวสร้างที่คูณทุกตัวเลขในรายการด้วยสอง

สำหรับการอ่านเพิ่มเติม โปรดดูบทแนะนำเกี่ยวกับการเขียนและใช้ Python iterators ตอนนี้คุณพร้อมที่จะเริ่มทำงานกับเครื่องกำเนิดไฟฟ้าใน Python อย่างผู้เชี่ยวชาญแล้ว!