Considérer:
>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2
Ainsi, l'avancement de l'itérateur est, comme prévu, géré par la mutation de ce même objet.
Cela étant le cas, je m'attendrais à:
a = iter(list(range(10)))
for i in a:
print(i)
next(a)
pour sauter tous les deux éléments: l'appel à next
devrait avancer l'itérateur une fois, puis l'appel implicite effectué par la boucle devrait l'avancer une deuxième fois - et le résultat de ce deuxième appel serait assigné à i
.
Ce n'est pas le cas. La boucle imprime tous les éléments de la liste, sans en sauter aucun.
Ma première pensée a été que cela pourrait se produire parce que la boucle fait appel iter
à ce qu'elle est passé, et cela pourrait donner un itérateur indépendant - ce n'est pas le cas, comme nous l'avons fait iter(a) is a
.
Alors, pourquoi ne next
semble pas faire avancer l'itérateur dans ce cas?
i
a déjà été attribué.next(a)
signifie que la prochaine itération2
est assignéei
, puis vous vous déplacez àa
nouveau, imprimezi
, etc.StopIteration
exceptionnellement, ilnext(a)
est déclenché lorsqu'il est appelé après que la liste est épuisée.Ce qui se passe, c'est que
next(a)
renvoie la valeur suivante de a, qui est imprimée sur la console car elle n'est pas affectée.Ce que vous pouvez faire, c'est affecter une variable avec cette valeur:
la source
Je trouve les réponses existantes un peu déroutant, car ils ne montrent indirectement la chose mystifiant essentiel dans l'exemple de code: à la fois * le « print i » et la « prochaine (a) » sont à l' origine de leurs résultats à imprimer.
Puisqu'ils impriment des éléments alternés de la séquence originale, et qu'il est inattendu que l'instruction "next (a)" s'imprime, il semble que l'instruction "print i" imprime toutes les valeurs.
Dans cette optique, il devient plus clair que l'affectation du résultat de "next (a)" à une variable empêche l'impression de son résultat, de sorte que seules les valeurs alternatives que la variable de boucle "i" sont imprimées. De même, le fait de faire émettre à l'instruction "print" quelque chose de plus distinctif l'élimine également.
(L'une des réponses existantes réfute les autres parce que cette réponse consiste à évaluer l'exemple de code sous forme de bloc, de sorte que l'interpréteur ne rapporte pas les valeurs intermédiaires pour "next (a)".)
La chose séduisante en répondant aux questions, en général, est d'être explicite sur ce qui est évident une fois que vous connaissez la réponse. Cela peut être insaisissable. De même, critiquez les réponses une fois que vous les avez comprises. C'est intéressant...
la source
Quelque chose ne va pas avec votre Python / ordinateur.
Fonctionne comme prévu.
Testé en Python 2.7 et en Python 3+. Fonctionne correctement dans les deux
la source
Pour ceux qui ne comprennent toujours pas.
Comme d'autres l'ont déjà dit,
next
augmente l'itérateur de 1 comme prévu. Assigner sa valeur retournée à une variable ne change pas son comportement par magie.la source
Il se comporte comme vous le souhaitez s'il est appelé en tant que fonction:
la source