Для выбора только одного элемента генератора используйте 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является обычным.