У меня есть функция генератора, как показано ниже:
def myfunct():
...
yield result
Обычный способ вызова этой функции:
for r in myfunct():
dostuff(r)
Мой вопрос, есть ли способ получить только один элемент из генератора, когда мне нравится? Например, я хотел бы сделать что-то вроде:
while True:
...
if something:
my_element = pick_just_one_element(myfunct())
dostuff(my_element)
...
python
iterator
generator
python-2.x
Александрос
источник
источник
next(gen, default)
может также использоваться, чтобы избежатьStopIteration
исключения. Например,next(g, None)
для генератора строк выдает либо строку, либо None после завершения итерации.next(g)
. Это вызов изнутриg.__next__()
, но вам не нужно об этом беспокоиться, как обычно вам все равно, чтоlen(a)
звонит изнутриa.__len__()
.g.next()
находитсяg.__next__()
в py3k. Встроенная системаnext(iterator)
существует начиная с Python 2.6 и должна использоваться во всем новом коде Python, и ее тривиально для backimplement, если вам нужна поддержка py <= 2.5.Для выбора только одного элемента генератора используйте
break
вfor
выражении, илиlist(itertools.islice(gen, 1))
Согласно вашему примеру (буквально) вы можете сделать что-то вроде:
Если вы хотите « получить только один элемент из [когда-то сгенерированного] генератора всякий раз, когда мне нравится » (я полагаю, что 50% - это первоначальное и наиболее распространенное намерение), тогда:
Таким образом
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
является обычным.источник
mySeq.head
?Я не верю, что есть удобный способ извлечь произвольное значение из генератора. Генератор предоставит метод next () для обхода себя, но полная последовательность не создается сразу для экономии памяти. Это функциональная разница между генератором и списком.
источник
Для тех из вас, кто просматривает эти ответы, чтобы получить полный рабочий пример для Python3 ... хорошо, вы идете:
Это выводит:
источник
Генератор - это функция, которая производит итератор. Поэтому, когда у вас есть экземпляр итератора, используйте next (), чтобы получить следующий элемент из итератора. Например, используйте функцию next () для извлечения первого элемента, а затем используйте
for in
для обработки оставшихся элементов:источник
убедитесь, что перехвачено исключение после последнего элемента
источник
Я считаю, что единственный способ - получить список от итератора, а затем получить нужный элемент из этого списка.
источник
myfunct()
генерируется большое количество значений), поскольку вы можете использовать встроенную функциюnext
для получения следующего сгенерированного значения.