在Python迭代器hasNext?

没有Python迭代器有一个hasNext方法?

不,没有这样的方法。 迭代的结束由一个例外指示。 请参阅文档 。

通过使用next(iterator, default_value)还有一种替代StopIteration的方法。

对于exapmle:

 >>> a = iter('hi') >>> print next(a, None) h >>> print next(a, None) i >>> print next(a, None) None 

所以如果你不需要exception的方式,你可以检测到None或其他预先指定的值。

如果你真的需要一个has-nextfunction(因为你只是忠实地从Java的参考实现中转录出一个algorithm,或者因为你正在编写一个需要在完成时被转换成Java的原型),用一个小包装类很容易获得它。 例如:

 class hn_wrapper(object): def __init__(self, it): self.it = iter(it) self._hasnext = None def __iter__(self): return self def next(self): if self._hasnext: result = self._thenext else: result = next(self.it) self._hasnext = None return result def hasnext(self): if self._hasnext is None: try: self._thenext = next(self.it) except StopIteration: self._hasnext = False else: self._hasnext = True return self._hasnext 

现在有点像

 x = hn_wrapper('ciao') while x.hasnext(): print next(x) 

发射

 c i a o 

按要求。

请注意,使用next(sel.it)作为内置需要Python 2.6或更高版本; 如果您使用的是旧版本的Python,请改为使用self.it.next() (在示例中使用next(x) )。 [[你可能会认为这个说明是多余的,因为Python 2.6已经存在了一年多了,但是当我在回应中使用Python 2.6特性时,有些评论者或其他人觉得责任必须指出他们 2.6的function,因此我试图阻止这样的评论一次;-)]]

从任何迭代器对象中尝试__length_hint __()方法:

 iter(...).__length_hint__() > 0 

除了所有提到的StopIteration之外,Python“for”循环只是做你想做的事情:

 >>> it = iter("hello") >>> for i in it: ... print i ... h e l l o 

hasNext有点翻译为StopIterationexception,例如:

 >>> it = iter("hello") >>> it.next() 'h' >>> it.next() 'e' >>> it.next() 'l' >>> it.next() 'l' >>> it.next() 'o' >>> it.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration 
  • StopIteration文档: http : //docs.python.org/library/exceptions.html#exceptions.StopIteration
  • 一些关于python中的迭代器和生成器的文章: http : //www.ibm.com/developerworks/library/l-pycon.html

不。最相似的概念很可能是StopIterationexception。

您可以使用迭代器itertools.tee来启动迭代器,并在迭代器上检查StopIteration

我相信Python只是有next()和根据文档,它会抛出一个exception是没有更多的元素。

http://docs.python.org/library/stdtypes.html#iterator-types

导致我search这个的用例如下

 def setfrom(self,f): """Set from iterable f""" fi = iter(f) for i in range(self.n): try: x = next(fi) except StopIteration: fi = iter(f) x = next(fi) self.a[i] = x 

hasnext()是可用的,可以做

 def setfrom(self,f): """Set from iterable f""" fi = iter(f) for i in range(self.n): if not hasnext(fi): fi = iter(f) # restart self.a[i] = next(fi) 

这对我来说是更清洁的。 很明显,你可以通过定义实用类来解决问题,但是随之而来的是你会遇到二十多种不同的几乎相同的解决方法,每个方法都有他们的怪癖,如果你想重用使用不同解决方法的代码,你必须在您的单个应用程序中有多个近似等价物,或者绕过代码重写并使用相同的方法。 “做一次,做得好”格言不成问题。

此外,迭代器本身需要有一个内部的“hasnext”检查来运行,看看是否需要引发exception。 这个内部检查是隐藏的,所以它需要通过试图获取一个项目,捕获exception并运行处理程序(如果抛出)来testing。 这是不必要的隐藏IMO。

这样的问题/问题的好办法是检查我们在目录(对象/方法/迭代器/types/类/ …)

你会看到dir(iterator)返回__length_hint__

iterator.__length_hint__()是积极的,直到迭代结束。

而已。

我喜欢这个:

 While(True): try: # Do something with the next value iterator.next() except StopIteration: break