這zip
東西吃的第一個項目產生,所以它不是一個好主意爲好。
如果發生器由獲得並保持它,直到得到所需的項目只能檢測。以下課程將幫助你這樣做。
如果需要,它會從迭代器中獲取一個項目並保留它。
如果要求emptyness(if myiterwatch: ...
),它會嘗試獲取並返回如果能得到一個。
如果問下一個項目,它將返回檢索到的一個或一個新的。
class IterWatch(object):
def __init__(self, it):
self.iter = iter(it)
self._pending = []
@property
def pending(self):
try:
if not self._pending:
# will raise StopIteration if exhausted
self._pending.append(next(self.iter))
except StopIteration:
pass # swallow this
return self._pending
def next(self):
try:
return self.pending.pop(0)
except IndexError:
raise StopIteration
__next__ = next # for Py3
def __iter__(self): return self
def __nonzero__(self):
# returns True if we have data.
return not not self.pending
# or maybe bool(self.pending)
__bool__ = __nonzero__ # for Py3
這解決了一個非常通用的方式的問題。如果你有,你只是想測試一個迭代器,你可以使用
guard = object()
result = return_generator()
if next(result, guard) is not guard:
print 'Yes, the generator did generate something!'
next(a, b)
回報b
如果迭代器a
耗盡。所以如果它在我們的情況下返回警衛,那麼它不會產生任何東西,否則它會發生。
但你zip()
的做法是完全合法的,以及...
*嘆*我今天有一個真正的大腦褪色。我急切地等待有人回答這個問題。 :P – detly 2012-03-15 08:47:42
@detly不,它不消耗發電機。您可以編寫一個生成器,在生成和測試時進行打印。 – satoru 2012-03-15 08:48:49
是的,我意識到,當我測試它(雖然它消耗的第一個項目)。這就是爲什麼我刪除了我原來的評論:P – detly 2012-03-15 08:58:01