N'ai pas Python itérateurs a un hasNext
méthode?
Réponses
Trop de publicités?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.
Non, il n'y a pas une telle méthode. La fin de l'itération est indiqué par une exception. Voir la documentation.
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;-)]]
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
-
StopIteration
docs: http://docs.python.org/library/exceptions.html#exceptions.StopIteration - Certains article sur les itérateurs et générateur en python: http://www.ibm.com/developerworks/library/l-pycon.html