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 ?
Tsunami Scripter
質問する
2287 次
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 に答える