สำหรับการเลือกเพียงหนึ่งองค์ประกอบของเครื่องกำเนิดไฟฟ้าที่ใช้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:
ของfor
statement นั้นจำเป็นต่อเมื่อคุณต้องการทำสิ่งพิเศษในกรณีที่เครื่องกำเนิดสิ้นสุด
หมายเหตุเกี่ยวกับ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
เป็นธรรมดา