Есть ли альтернативный способ вызова Next на генераторах Python? - PullRequest
3 голосов
/ 01 февраля 2009

У меня есть генератор, и я хотел бы знать, могу ли я его использовать, не беспокоясь о StopIteration, и я хотел бы использовать его без for item in generator. Я хотел бы использовать его с оператором while например (или другими конструкциями). Как я мог это сделать?

Ответы [ 3 ]

15 голосов
/ 01 февраля 2009

встроенная функция

следующий (итератор [, по умолчанию])
Получить следующий элемент из итератора, вызвав его метод __next__(). Если задано значение по умолчанию, оно возвращается, если итератор исчерпан, в противном случае вызывается StopIteration.

В Python 2.5 и старше:

raiseStopIteration = object()
def next(iterator, default=raiseStopIteration):
    if not hasattr(iterator, 'next'):
       raise TypeError("not an iterator")
    try:
       return iterator.next()
    except StopIteration:
        if default is raiseStopIteration:
           raise
        else:
           return default
1 голос
/ 01 февраля 2009

Другой вариант - прочитать все значения генератора одновременно:

>>> alist = list(agenerator)

Пример:

>>> def f():
...   yield 'a'
...
>>> a = list(f())
>>> a[0]
'a'
>>> len(a)
1
0 голосов
/ 01 февраля 2009

Используйте это, чтобы обернуть ваш генератор:

class GeneratorWrap(object):

      def __init__(self, generator):
          self.generator = generator

      def __iter__(self):
          return self

      def next(self):
          for o in self.generator:
              return o
          raise StopIteration # If you don't care about the iterator protocol, remove this line and the __iter__ method.

Используйте это так:

def example_generator():
    for i in [1,2,3,4,5]:
        yield i

gen = GeneratorWrap(example_generator())
print gen.next()  # prints 1
print gen.next()  # prints 2

Обновление: Пожалуйста, используйте ответ ниже, потому что он намного лучше, чем этот.

...