No he Python iteradores obtuvo un hasNext
método?
Respuestas
¿Demasiados anuncios?Hay una alternativa a la StopIteration
mediante next(iterator, default_value)
.
Para exapmle:
>>> a = iter('hi')
>>> print next(a, None)
h
>>> print next(a, None)
i
>>> print next(a, None)
None
Así que usted puede detectar None
u otros pre-valor especificado para el final de la iterador si usted no desea que la excepción.
No, no existe tal método. Al final de la iteración es indicado por una excepción. Consulte la documentación.
Si usted realmente necesita un has-next
funcionalidad (porque estás fielmente la transcripción de un algoritmo a partir de una implementación de referencia en Java, por ejemplo, o porque usted está escribiendo un prototipo que se necesita para ser fácilmente transcribe a Java cuando se termine), es fácil de obtener con un poco de clase de contenedor. Por ejemplo:
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
ahora algo como
x = hn_wrapper('ciao')
while x.hasnext(): print next(x)
emite
c
i
a
o
como se requiere.
Tenga en cuenta que el uso de next(sel.it)
como un built-in requiere Python 2.6 o mejor; si usted está utilizando una versión anterior de Python, uso self.it.next()
lugar (y lo mismo para next(x)
en el uso de ejemplo). [[Se puede razonablemente pensar que esta nota es redundante, ya que Python 2.6 ha sido de alrededor de más de un año ahora, pero más a menudo que no, cuando yo uso Python 2.6 características de una respuesta, algún comentarista o otro se siente en el deber de señalar que son 2.6 características, lo que estoy tratando de evitar esos comentarios de una vez;-)]]
hasNext
algo traduce a la StopIteration
excepción, por ejemplo:
>>> 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
docs: http://docs.python.org/library/exceptions.html#exceptions.StopIteration- Algún artículo acerca de los iteradores y generador en python: http://www.ibm.com/developerworks/library/l-pycon.html
No. La mayoría de concepto similar es más probable que un StopIteration excepción.