คุณสามารถใช้return
ครั้งเดียวในเครื่องกำเนิดไฟฟ้า มันหยุดการทำซ้ำโดยไม่ให้ผลตอบแทนใด ๆ และด้วยเหตุนี้จึงเป็นทางเลือกที่ชัดเจนในการปล่อยให้ฟังก์ชันหมดขอบเขต ดังนั้นใช้yield
เพื่อเปลี่ยนฟังก์ชันให้เป็นเครื่องกำเนิดไฟฟ้า แต่นำหน้าด้วยreturn
เพื่อยุติเครื่องกำเนิดไฟฟ้าก่อนที่จะให้ผลอะไร
>>> def f():
... return
... yield
...
>>> list(f())
[]
ผมไม่แน่ใจว่ามันเป็นเรื่องที่ดีกว่าสิ่งที่คุณมี - มันก็แทนที่ไม่มี-op if
คำสั่งกับไม่มี-op yield
คำสั่ง แต่มันเป็นสำนวนมากกว่า โปรดทราบว่าการใช้yield
ไม่ได้ผล
>>> def f():
... yield
...
>>> list(f())
[None]
ทำไมไม่ใช้ iter(())
?
คำถามนี้ถามเฉพาะเกี่ยวกับความว่างเปล่า ฟังก์ชั่นเครื่องกำเนิดไฟฟ้า ด้วยเหตุนี้ฉันจึงใช้คำถามเกี่ยวกับความสอดคล้องภายในของไวยากรณ์ของ Python มากกว่าคำถามเกี่ยวกับวิธีที่ดีที่สุดในการสร้างตัววนซ้ำที่ว่างเปล่าโดยทั่วไป
หากคำถามเป็นวิธีที่ดีที่สุดในการสร้างตัววนซ้ำที่ว่างเปล่าคุณอาจเห็นด้วยกับZectbumoเกี่ยวกับการใช้iter(())
แทน อย่างไรก็ตามสิ่งสำคัญคือต้องสังเกตiter(())
ว่าไม่ได้ส่งคืนฟังก์ชัน! ส่งคืนค่าว่างที่สามารถทำซ้ำได้โดยตรง สมมติว่าคุณกำลังทำงานกับ API ที่คาดว่าจะสามารถเรียกใช้ได้ซึ่งจะส่งคืนการทำซ้ำทุกครั้งที่เรียกเช่นเดียวกับฟังก์ชันเครื่องกำเนิดไฟฟ้าทั่วไป คุณจะต้องทำสิ่งนี้:
def empty():
return iter(())
(เครดิตควรไปที่ Unutbuเพื่อให้คำตอบรุ่นแรกที่ถูกต้อง)
ตอนนี้คุณอาจพบสิ่งที่ชัดเจนกว่าข้างต้น แต่ฉันสามารถจินตนาการถึงสถานการณ์ที่มันจะชัดเจนน้อยลง พิจารณาตัวอย่างของคำจำกัดความของฟังก์ชันเครื่องกำเนิดไฟฟ้า (ที่สร้างขึ้น) แบบยาวนี้:
def zeros():
while True:
yield 0
def ones():
while True:
yield 1
...
ในตอนท้ายของรายการยาวนั้นฉันอยากจะเห็นอะไรบางอย่างyield
อยู่ในนั้นเช่นนี้:
def empty():
return
yield
หรือใน Python 3.3 ขึ้นไป (ตามที่แนะนำโดยDSM ) สิ่งนี้:
def empty():
yield from ()
การมีอยู่ของyield
คีย์เวิร์ดทำให้เห็นได้ชัดเจนในภาพรวมสั้น ๆ ว่านี่เป็นเพียงฟังก์ชันตัวสร้างอื่นเหมือนกับฟังก์ชันอื่น ๆ ทั้งหมด ต้องใช้เวลาอีกเล็กน้อยเพื่อดูว่าiter(())
เวอร์ชันกำลังทำสิ่งเดียวกัน
มันเป็นความแตกต่างที่เล็กน้อย แต่ฉันคิดว่า yield
ตามฟังก์ชั่นพื้นฐานนั้นอ่านง่ายและบำรุงรักษาได้มากกว่า
ดูคำตอบที่ยอดเยี่ยมนี้จากuser3840170ที่ใช้dis
เพื่อแสดงเหตุผลอื่นว่าทำไมวิธีนี้จึงเป็นที่ต้องการ: มันแสดงคำแนะนำน้อยที่สุดเมื่อรวบรวม
if False: yield
แต่ก็ยังค่อนข้างสับสนสำหรับคนที่ไม่รู้จักรูปแบบนี้