Est générateur.next() visible en python 3.0?
J'ai un générateur qui génère une série, par exemple:
def triangleNums():
'''generate series of triangle numbers'''
tn = 0
counter = 1
while(True):
tn = tn + counter
yield tn
counter = counter + 1
dans la version 2.6 de python, je suis en mesure de faire les appels suivants:
g = triangleNums() # get the generator
g.next() # get next val
cependant dans la version 3.0 si j'exécute les deux mêmes lignes de code, j'obtiens l'erreur suivante:
AttributeError: 'generator' object has no attribute 'next'
mais, la boucle de l'itérateur de la syntaxe ne fonctionne dans la version 3.0
for n in triangleNums():
if not exitCond:
doSomething...
Je n'ai pas été en mesure de trouver encore rien qui explique cette différence de comportement pour la 3.0.
Vous devez vous connecter pour publier un commentaire.
Correct,
g.next()
a été renommég.__next__()
. La raison pour cela est la cohérence: méthodes Spéciales comme__init__()
et__del__
ont tous un double soulignement (ou "dsous" dans le courant vernaculaire), et.next()
était l'une des rares exceptions à cette règle. Ceci a été corrigé dans Python 3.0. [*]Mais au lieu d'appeler
g.__next__()
, comme Paolo dit, l'utilisationnext(g)
.[*] Il y a d'autres attributs spéciaux qui ont obtenu ce correctif;
func_name
, est maintenant__name__
, etc.Essayer:
Découvrez cette table soignée qui montre les différences de syntaxe entre 2 et 3 lorsqu'il s'agit de cela.
Si votre code doit s'exécuter sous Python2 et Python3, utilisez le 2to3 six bibliothèque comme ceci:
next
fonction intégrée.