Для вибору лише одного елемента генератора використовуйте 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()можна уникнути явного використання , а обробка в кінці вводу не вимагає (критичного) StopIterationоброблення виключень або додаткових порівнянь за замовчуванням.
else:З forрозділу заяви необхідно тільки , якщо ви хочете зробити що - щось особливе в разі відслужили генератора.
Примітка про next()/ .next():
У Python3 .next()метод було перейменовано з .__next__()поважної причини: його вважали низьким рівнем (PEP 3114). До Python 2.6 вбудованої функції next()не існувало. І навіть обговорювалося перехід next()до operatorмодуля (що було б розумно) через рідкісну потребу та сумнівну інфляцію побудованих назв.
Використання next()без замовчування все ще є дуже низьким рівнем практики - відкрито викидати криптовалюту StopIterationяк болт у звичайний код програми. А використання next()дозорного режиму за замовчуванням - що найкраще має бути єдиним варіантом для next()безпосередньо в builtins- обмежене і часто дає підстави для непарної непітонічної логіки / читабельності.
Підсумок: Використання next () має бути дуже рідкісним - як використання функцій operatorмодуля. Використовуючи for x in iterator, islice, list(iterator)та інші функції , приймаючи итератор легко природний спосіб використання ітераторів на рівні додатків - і цілком можливо завжди. next()є низькорівневим, додатковою концепцією, непомітною - як показує питання цієї теми. Хоча, наприклад, використання breakв forзвичайному.