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

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