201 votes

hasNext itérateurs en Python?

N'ai pas Python itérateurs a un hasNext méthode?

297voto

Spirit Zhang Points 2728

Il y a une alternative à l' StopIteration par l'aide d' next(iterator, default_value).

Pour exapmle:

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

De sorte que vous pouvez détecter None ou d'autres pré-spécifié de la valeur de fin de l'itérateur si vous ne voulez pas l'exception.

133voto

avakar Points 20031

Non, il n'y a pas une telle méthode. La fin de l'itération est indiqué par une exception. Voir la documentation.

42voto

Alex Martelli Points 330805

Si vous avez vraiment besoin d' un has-next fonctionnalités (parce que vous êtes juste fidèlement la transcription d'un algorithme à partir d'une implémentation de référence en Java, par exemple, ou parce que vous êtes en train de rédiger un prototype qui aura besoin d'être facilement transcrit à Java quand c'est fini), il est facile de l'obtenir avec un peu de classe wrapper. Par exemple:

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

maintenant, quelque chose comme

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

émet

c
i
a
o

en tant que de besoin.

Notez que l'utilisation de next(sel.it) intégrée nécessite Python 2.6 ou mieux; si vous utilisez une ancienne version de Python, utilisez self.it.next() à la place (et de même pour l' next(x) dans l'exemple d'utilisation). [[Vous pourriez raisonnablement penser que la présente note est redondant, depuis la version 2.6 de Python a été autour depuis plus d'un an maintenant, mais le plus souvent lorsque j'utilise la version 2.6 de Python dispose d'une réponse, certains intervenant ou l'autre se sent le devoir de leur montrer qu'ils sont de 2,6 fonctionnalités, donc j'essaie de prévenir de tels commentaires, pour une fois;-)]]

16voto

Brian Clapper Points 11222

En plus de toutes les mentions de StopIteration, le Python la boucle "for" est tout simplement ce que vous voulez:

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

5voto

miku Points 63392

hasNext quelque peu se traduit par l' StopIteration d'exception, par exemple:

>>> 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X