สำหรับการเลือกเพียงหนึ่งองค์ประกอบของเครื่องกำเนิดไฟฟ้าที่ใช้breakในforคำสั่งหรือlist(itertools.islice(gen, 1))
ตามตัวอย่างของคุณ (ตามตัวอักษร) คุณสามารถทำสิ่งที่ชอบ:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
หากคุณต้องการ " รับเพียงองค์ประกอบหนึ่งจากเครื่องกำเนิด [สร้างครั้งเดียว] เมื่อใดก็ตามที่ฉันต้องการ " (ฉันคิดว่า 50% นั่นคือความตั้งใจเดิมและความตั้งใจที่พบบ่อยที่สุด) จากนั้น:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
วิธีนี้generator.next()สามารถหลีกเลี่ยงการใช้อย่างชัดเจนและไม่จำเป็นต้องใช้การจัดการปลายทาง (cryptic)StopIterationจัดการข้อยกเว้นหรือการเปรียบเทียบค่าเริ่มต้นพิเศษ
ส่วนelse:ของforstatement นั้นจำเป็นต่อเมื่อคุณต้องการทำสิ่งพิเศษในกรณีที่เครื่องกำเนิดสิ้นสุด
หมายเหตุเกี่ยวกับnext()/ .next():
ใน Python3 .next()วิธีการถูกเปลี่ยนชื่อเป็น.__next__()เหตุผลที่ดี: มันถือว่าระดับต่ำ (PEP 3114) ก่อนหน้า Python 2.6 ฟังก์ชัน builtin next()ไม่มีอยู่ และมันก็ถูกกล่าวถึงเพื่อย้ายnext()ไปยังoperatorโมดูล (ซึ่งจะฉลาด) เนื่องจากความต้องการที่หายากและอัตราเงินเฟ้อที่น่าสงสัยของชื่อในตัว
การใช้งานnext()โดยไม่มีค่าเริ่มต้นนั้นยังคงเป็นวิธีปฏิบัติระดับต่ำมาก - การขว้างลับStopIterationเหมือนสายฟ้าออกจากสีน้ำเงินในรหัสแอปพลิเคชันปกติอย่างเปิดเผย และใช้next()กับ Sentinel ที่เป็นค่าเริ่มต้น - ซึ่งเป็นทางเลือกที่ดีที่สุดสำหรับการเข้าใช้next()โดยตรงbuiltins - ถูก จำกัด และมักจะให้เหตุผลกับตรรกะที่ไม่ใช่ pythonic ตรรกะ / readablity
Bottom line: การใช้ next () ควรหายากมากเช่นการใช้ฟังก์ชันของoperatorโมดูล การใช้for x in iterator, islice, list(iterator)และฟังก์ชั่นอื่น ๆ ยอมรับ iterator ต่อเนื่องเป็นวิธีที่ธรรมชาติของการใช้ iterators ในระดับแอพลิเคชัน - และค่อนข้างเป็นไปได้เสมอ next()อยู่ในระดับต่ำแนวคิดเพิ่มเติมพิเศษไม่เป็นที่ประจักษ์แจ้งตามคำถามของกระทู้นี้ ในขณะที่เช่นใช้breakในforเป็นธรรมดา