Reculer une itération dans une boucle for
Donc, je veux faire quelque chose comme ceci:
for i in range(5):
print(i);
if(condition==true):
i=i-1;
Cependant, pour quelque raison que ce soit, même si je suis décrémenter i, la boucle ne semble pas voir. Est-il possible de répéter une itération?
source d'informationauteur hemlocker
Vous devez vous connecter pour publier un commentaire.
for
boucles en Python toujours aller de l'avant. Si vous voulez être en mesure de se déplacer vers l'arrière, vous devez utiliser un autre mécanisme, commewhile
:Ou encore mieux:
Boucle Python à l'aide de
range
sont par-conception à partir de C/C++/Javafor
-boucles. Pour chaque itération, le je est de définir la valeur suivante derange(5)
peu importe ce que vous faites pouri
entre les deux.Vous pourriez utiliser tout en boucle à la place:
Mais honnêtement: j'avais du recul et réfléchir à nouveau sur votre problème d'origine. Probablement, vous trouverez une meilleure solution en tant que telle, les boucles sont toujours sujettes à l'erreur. Il ya une raison pourquoi Python
for
-boucles d'où conçus pour être différent.Vous avez un malentendu à propos de boucles en Python. Le
for
boucle ne se soucie pas ce que vous faites aveci
à chaque itération, car il n'est pas lié à la logique de la boucle. La modification dei
juste le lie une variable locale.Vous devez utiliser une boucle while pour obtenir le comportement que vous attendez, où l'état de
i
affecte le flux de contrôle de la boucle:Utiliser un
while
boucle:Comme il a été mentionné, c'est plutôt unidiomatic Python. Peut-être que si vous postez ce que vous essayez d'atteindre, nous pouvons donner quelques conseils.
range(5)
crée une liste avec les numéros de0
thru4
en elle -[0, 1, 2, 3, 4]
.Lorsque vous exécutez une boucle sur elle, vous êtes une itération sur la liste. Faire
i-= 1
ne décrémenter la valeur de cet élément particulier de la liste, et l'itération continue.Comme les autres réponses ici l'ont suggéré, vous devez utiliser un
while
boucle.Répéter de nombreuses autres réponses, et juste pour être complet, vous aurez besoin d'utiliser un
while loop
.Si vous voulez revenir à une itération dans la boucle (au lieu de répéter une itération), puis de les utiliser:
Essentiellement,
while i < 5
évalue à chaque itération, et vérifie sii < 5
. Ainsi, par la décrémentation/ne pas changer dei
nous obtenons quelque chose comme ceci: (les valeurs dei
)De ne pas changer:
1->2->3-(condition satisfied)> 3 -> 4 -> 5
Décrémentation:
1->2->3-(condition satisfied)>2 -> 3 -> 4 -> 5
La raison pour laquelle
i=i-1
dans votre boucle pour ne pas faire de répétition de l'itération est simple. Dans lefor
boucle,i
est affectée de la valeur de l'élément suivant dans la boucle for. Python ne s'intéressent pas à ce que vous faites aveci
tant qu'il est en mesure d'attribuer à l'élément suivant. Ainsi, la boucle forfor i in <your_iterable>:<do whatever>
est plus proche de ceci:Cependant, dans cette analogie, vous ne seriez pas en mesure d'accéder à la
_
fondée variables (_i
,_length
). Voilà comment je me simplifier la logique de lafor loop
. Notez que quel que soit ce quei
est attribué, il sera affecté à_i
lors de la prochaine itération, et la boucle n'est pas vraiment se soucier de cei
est.En Python il est possible de mettre en place un échange dans les deux sens entre un itérateur (ce qui vient après
in
dans unfor..in
boucle) et sa consommation (code à l'intérieur de la boucle). Pour ce faire, vous pouvez utiliserenvoyer
dans le code de la consommation d ' "injecter" une valeur dans un générateur. Dans votre cas, vous pouvez simplement envoyer la valeur actuelle une fois que la condition est remplie et envelopper lerange
appel à un générateur qui se répète tout ce qui est envoyé vers elle. Voici un code pour vous de jouer, volontairement détaillé pour plus de clarté: