หลักสูตรการพัฒนาด้วย Python ขั้นสูง
บทที่
>
ระดับ
เจนเนอเรเตอร์
การเลื่อน Generator ด้วยตนเอง
วัตถุประสงค์
ใช้ generator ในลำดับขั้นตอนด้วยตนเองเพื่อรวบรวมและผลิตวัสดุสำหรับทำขนมปัง
ข้างหน้ามีสถานที่ที่คุณสามารถรวบรวมแป้งทำขนมปังโดยใช้เครื่องกด โดยปกติแล้วคุณจะใช้ฟังก์ชัน combine() เพื่อรวบรวมวัสดุ แต่ในกรณีนี้ไม่ใช่ เพราะวัสดุจำเป็นต้องได้รับการปรับสภาพก่อนที่จะสามารถรวบรวมได้
สำหรับงานนี้ เราสามารถใช้ generators ได้ เนื่องจากสามารถปรับแต่งให้ส่งออกไฟล์ชนิดต่าง ๆ รวมถึงสามารถเรียกลำดับการทำงานตามคำสั่งได้ แทนที่จะส่งออกอัตโนมัติเหมือนฟังก์ชันและลูป นี่คือตัวอย่าง:
def bread():
yield 5
yield "grain"
โค้ดด้านบนเป็น generator ที่มีคำสั่ง yield สองคำสั่ง หนึ่งในนั้นให้ค่าจำนวนจริงและอีกคำสั่งให้ค่าสตริง เราสามารถเรียกค่าจาก generator ได้ตามต้องการโดยใช้ฟังก์ชัน next() เช่นนี้:
recipe = bread() # Sets up Generator player.place(next(recipe)) # First value is called player.collect(next(recipe)) # Second value is called
ในตัวอย่างข้างต้น ได้มีการตั้งค่า generator และใช้ฟังก์ชัน next() กับ generator เพื่อเรียกค่าผลลัพธ์แรกของคำสั่ง yield เพื่อนำไปใช้ในฟังก์ชัน place() ขั้นตอนนี้ทำซ้ำกับค่าที่สอง แต่จะถูกนำไปใช้ในฟังก์ชัน collect() วิธีนี้ทำให้การเรียกค่าประเภทต่าง ๆ ในลำดับขั้นตอนเป็นเรื่องง่ายโดยไม่จำเป็นต้องใช้รายการหรือค่าตัวแปรหลายตัว
Generator ที่ชื่อว่า bread() จะถูกกำหนดในตัวแก้ไขโค้ด แต่จะต้องมีตัวเลขจำนวนสำหรับแต่ละส่วนผสมเพื่อให้คุณปรับสภาพแป้งทำขนมปัง ตัวเลขเหล่านี้ถูกเขียนไว้บนป้ายข้างสถานที่ดังกล่าว ตั้งค่า generator สำหรับการใช้งานโดยการอ้างอิงมัน เช่นนี้: recipe = bread()
เริ่มต้นเดินไปยังเครื่องหมาย X สีอ่อนข้างถังนมและ collect() นมนมสุดท้ายในถังโดยใช้ฟังก์ชัน next() ของ generator เช่นนี้: player.collect(next(recipe)) จากนั้นเดินไปที่เครื่องหมาย X สีทองข้างป้ายและใช้ฟังก์ชัน speak() เพื่อรับตัวเลขจำนวนที่จำเป็นสำหรับ generator ในการผลิตขนมปังและบันทึกลงใน generator ข้อมูลจะถูกเก็บไว้ในค่าคงที่ที่ชื่อว่า "sign" และจะถูกเรียกใช้งานดังนี้: player.speak(sign)
เมื่อตัวเลขทั้งหมดถูกป้อนลงใน generator แล้ว ให้เข้าสู่สถานที่และใช้ player.place(next(recipe)) กับเครื่องหมาย X สีเข้มและ player.collect(next(recipe)) กับเครื่องหมาย X สีอ่อนเพื่อทำขั้นตอนในระดับนี้ให้สำเร็จ