Supposons que j'aie 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 cela n'a pas fonctionné. Comment dois-je procéder ?
Supposons que j'aie 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 cela n'a pas fonctionné. Comment dois-je procéder ?
Pour votre exemple particulier, cela fonctionnera :
for i in range(1, 10):
if i in (5, 6):
continue
Cependant, il est probablement préférable d'opter pour une while
boucle :
i = 1
while i < 10:
if i == 5:
i = 7
# other code
i += 1
A for
assigne une variable (dans ce cas i
) à l'élément suivant de la liste/du tableau au début de chaque itération. Cela signifie que, quoi que vous fassiez à l'intérieur de la boucle, i
deviendra l'élément suivant. L'élément while
n'a pas de restriction de ce type.
Un peu plus de détails sur la raison pour laquelle la boucle de la question ne fonctionne pas comme prévu.
Une boucle
for i in iterable:
# some code with i
est essentiellement une abréviation pour
iterator = iter(iterable)
while True:
try:
i = next(iterator)
except StopIteration:
break
# some code with i
Ainsi, le for
extrait une à une les valeurs d'un itérateur construit à partir de l'objet itérable et reconnaît automatiquement l'épuisement de l'itérateur et s'arrête.
Comme vous pouvez le constater, à chaque itération de la fonction while
boucle i est réaffecté Par conséquent, la valeur de i
sera remplacée par d'autres réaffectations, quelles qu'elles soient, que vous avez effectuées dans le cadre de la procédure d'autorisation. # some code with i
partie.
C'est la raison pour laquelle, for
en Python ne sont pas adaptées aux changements permanents de la variable de la boucle et vous devez recourir à une fonction while
comme cela a déjà été démontré dans la réponse de Volatility.
Ce concept n'est pas inhabituel dans le monde C, mais devrait être évité si possible. Néanmoins, voici comment je l'ai mis en œuvre, d'une manière qui m'a semblé claire. Vous pouvez donc placer votre logique de saut dans l'index n'importe où dans la boucle, et un lecteur saura qu'il doit faire attention à la variable de saut, alors que l'intégration d'un i=7 quelque part dans la boucle 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>
L'idée simple est que i prend une valeur après chaque itération, indépendamment de ce à quoi il est assigné à l'intérieur de la boucle, parce que la boucle incrémente la variable itérative à la fin de l'itération et comme la valeur de i est déclarée à l'intérieur de la boucle, elle est simplement écrasée. Vous devriez probablement assigner i à une autre variable et la modifier. Par exemple
for i in range(1,10):
if i == 5:
u = 7
et vous pouvez ensuite interrompre la boucle en utilisant "break" à l'intérieur de la boucle pour empêcher toute itération supplémentaire puisque la condition requise a été remplie.
Tout comme timgeb a expliqué que l'index que vous avez utilisé se voyait attribuer une nouvelle valeur au début de la boucle for à chaque fois, la méthode que j'ai trouvée pour fonctionner est d'utiliser un autre index.
Par exemple, voici votre code original :
for i in range(1,10):
if i is 5:
i = 7
vous pouvez utiliser celui-ci à la place :
i = 1
j = i
for i in range(1,10):
i = j
j += 1
if i == 5:
j = 7
De plus, si vous modifiez des éléments d'une liste dans la boucle for, il se peut que vous deviez également mettre à jour la plage en range(len(list)) à la fin de chaque boucle si vous avez ajouté ou supprimé des éléments à l'intérieur de la liste. La façon dont je procède consiste à assigner un autre index pour en garder la trace.
list1 = [5,10,15,20,25,30,35,40,45,50]
i = 0
j = i
k = range(len(list1))
for i in k:
i = j
j += 1
if i == 5:
j = 7
if list1[i] == 20:
list1.append(int(100))
# suppose you remove or add some elements in the list at here,
# so now the length of the list has changed
k = range(len(list1))
# we use the range function to update the length of the list again at here
# and save it in the variable k
Mais il serait tout de même plus pratique d'utiliser la boucle while à la place. Quoi qu'il en soit, j'espère que cela vous aidera.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.