Coding for KidsCoding for Kids
ระดับสร้างสรรค์ความท้าทายคู่มือครู
โหวตสำหรับฟีเจอร์
หลักสูตรการพัฒนาด้วย Python ขั้นสูง
บทที่
>
ระดับ

ตัวสร้าง (Generators)
สร้างเจนเนอเรเตอร์

บางครั้งคุณอาจต้องการสร้างค่าที่สม่ำเสมอแทนที่จะเป็นผลลัพธ์เพียงครั้งเดียว เช่นเดียวกับวิธีการทำงานของฟังก์ชัน ตัวสร้างจะถูกเขียนและดำเนินการในลักษณะเดียวกัน ยกเว้นพวกเขาใช้ yield() แทน return() เมื่อผลิตผลลัพธ์

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

Guide

วัตถุประสงค์

เติมนมลงในขวดโดยการสูบนมจากถังเก็บด้วยเครื่องกำเนิดไฟฟ้า

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

มีถังนมสอง (2) ถังที่ต้องถูกสูบและบรรจุนมลงในขวด แต่ละเครื่องมีช่องเก็บนมซึ่งแทนด้วยค่าคงที่ในรูปแบบรายการชื่อ: tank_a และ tank_b นอกจากนี้แต่ละถังยังมีนมเกินที่คุณสามารถเก็บได้

ตัวสร้างตามหลักการเดียวกับฟังก์ชันแต่จะใช้ yield แทน return สำหรับผลลัพธ์ ตั้งค่าตัวสร้างชื่อ fill() และตั้งค่าให้มีอาร์กิวเมนต์ list ซึ่งจะเป็นจุดที่คุณใส่ค่าคงที่ที่กล่าวถึงในย่อหน้าด้านบน

def fill(list): for x in range(3): yield list[x] yield 5

ตัวสร้างจะอ่านข้อมูลจากสาม (3) ช่องในค่าคงที่ของรายการซึ่งแทนด้วยช่องเก็บในเครื่องจักร และเพิ่มส่วนเกินที่ท้ายซึ่งคือห้า (5)

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

ด้วยประโยชน์จากคำสั่ง yield ค่าที่ได้จากตัวสร้างสามารถอ่านได้โดยตรงจากลูป for ด้วย ตั้งค่าขึ้นมาเพื่อใช้ฟังก์ชัน collect() เพื่อเก็บ "milk" จากเครื่องจักร จากนั้นใช้ speak() เพื่อตรวจสอบว่านมแต่ละขวดเก็บได้เท่าไหร่ ตัวอย่างเช่น:

for bottles in fill(tank_a): player.collect("milk") player.speak("%d pints of milk collected" % (bottles))

เขียนและใช้ลูป for นี้บนจุด X ทั้งสองจุด บนจุด X ที่สว่างใช้ tank_a เป็นอาร์กิวเมนต์ และบนจุด X ที่มืดให้ใช้ tank_b เป็นอาร์กิวเมนต์เพื่อทำเลเวลให้สมบูรณ์

หนังสือโค้ด