4

I have a generator and I would like to know if I can use it without having to worry about StopIteration , and I would like to use it without the for item in generator . I would like to use it with a while statement for example ( or other constructs ). How could I do that ?

4

3 に答える 3

15

組み込み関数

next(iterator[, default])メソッド
を呼び出して、反復子から次の項目を取得します__next__() 。default が指定されている場合、イテレータが使い果たされた場合はそれが返され、それ以外の場合は 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
于 2009-02-01T11:12:53.937 に答える
2

もう 1 つのオプションは、すべてのジェネレーター値を一度に読み取ることです。

>>> alist = list(agenerator)

例:

>>> def f():
...   yield 'a'
...
>>> a = list(f())
>>> a[0]
'a'
>>> len(a)
1
于 2009-02-01T12:16:35.897 に答える
-1

これを使用してジェネレーターをラップします。

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

更新:これよりもはるかに優れているため、以下の回答を使用してください。

于 2009-02-01T11:13:09.177 に答える