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