ตัววนซ้ำมีบทบาทสำคัญใน 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 อย่างผู้เชี่ยวชาญแล้ว!