web-dev-qa-db-fra.com

Comment changer l'index de la boucle for en Python?

Supposons que j'ai une boucle for:

for i in range(1,10):
    if i is 5:
        i = 7

Je veux changer i s'il remplit certaines conditions. J'ai essayé mais ça n'a pas marché. Comment dois-je procéder?

43
drum

Pour votre exemple particulier, cela fonctionnera:

for i in range(1, 10):
    if i in (5, 6):
        continue

Cependant, vous seriez probablement mieux avec une boucle while:

i = 1
while i < 10:
    if i == 5:
        i = 7
    # other code
    i += 1

Une boucle for assigne une variable (dans ce cas i) à l'élément suivant dans la liste/itérable au début de chaque itération. Cela signifie que peu importe ce que vous faites dans la boucle, i deviendra l'élément suivant. La boucle while n'a pas une telle restriction.

71
Volatility

Un peu plus d'informations sur les raisons pour lesquelles la boucle de la question ne fonctionne pas comme prévu.

Une boucle

for i in iterable: 
    # some code with i

est fondamentalement un raccourci pour

iterator = iter(iterable)
while True:
    try:
        i = next(iterator)            
    except StopIteration:
        break
    # some code with i

Ainsi, la boucle for extrait les valeurs d'un itérateur construit à partir de l'itérable un par un et reconnaît automatiquement quand cet itérateur est épuisé et s'arrête.

Comme vous pouvez le voir, à chaque itération de la boucle whilei est réaffecté, la valeur de i sera donc remplacée quelles que soient les autres réaffectations que vous émettez dans le # some code with i partie.

Pour cette raison, les boucles for dans Python ne sont pas adaptées aux modifications permanentes de la variable de boucle et vous devez plutôt recourir à une boucle while, comme cela a déjà été fait été démontré dans la réponse de Volatility.

15
timgeb

Ce concept n'est pas inhabituel dans le monde C, mais doit être évité si possible. Néanmoins, c'est ainsi que je l'ai mis en œuvre, d'une manière qui me semblait claire sur ce qui se passait. Ensuite, vous pouvez mettre votre logique pour sauter en avant dans l'index n'importe où dans la boucle, et un lecteur saura prêter attention à la variable skip, tandis que l'incorporation d'un i = 7 quelque part en profondeur peut facilement être manquée:

skip = 0
for i in range(1,10):
   if skip:
      skip -= 1
      continue

   if i=5:
      skip = 2

   <other stuff>
2
Nerf Herder