48 votos

hasNext en Python iteradores?

No he Python iteradores obtuvo un hasNext método?

53voto

Spirit Zhang Puntos 2728

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.

35voto

avakar Puntos 20031

No, no existe tal método. Al final de la iteración es indicado por una excepción. Consulte la documentación.

23voto

Alex Martelli Puntos 330805

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;-)]]

5voto

miku Puntos 63392

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

3voto

James Thompson Puntos 15464

No. La mayoría de concepto similar es más probable que un StopIteration excepción.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X