j'ai:
for i in range(2,n):
if(something):
do something
else:
do something else
i = 2 **restart the loop
Mais cela ne semble pas fonctionner. Y at-il un moyen de redémarrer cette boucle?
Merci
Vous voudrez peut-être envisager d'utiliser un type de boucle différent dans lequel cette logique est applicable, car c'est la réponse la plus évidente.
peut-être un:
i=2
while i < n:
if something:
do something
i += 1
else:
do something else
i = 2 #restart the loop
La modification de la variable d'indexation i
à l'intérieur de la boucle ne donnera probablement pas ce que vous attendez. Vous devrez peut-être utiliser une boucle while
à la place et contrôler vous-même l'incrémentation de la variable de boucle. À chaque fois autour de la boucle for
, i
est réaffecté avec la valeur suivante de range()
. Donc, quelque chose comme:
i = 2
while i < n:
if(something):
do something
else:
do something else
i = 2 # restart the loop
continue
i += 1
Dans mon exemple, l'instruction continue
revient en haut de la boucle en ignorant l'instruction i += 1
pour cette itération. Sinon, i
est incrémenté comme prévu (identique à la boucle for
).
Voici un exemple utilisant la méthode send()
du générateur :
def restartable(seq):
while True:
for item in seq:
restart = yield item
if restart:
break
else:
raise StopIteration
Exemple d'utilisation:
x = [1, 2, 3, 4, 5]
total = 0
r = restartable(x)
for item in r:
if item == 5 and total < 100:
total += r.send(True)
else:
total += item
Je voulais juste publier une alternative qui pourrait être plus génétiquement utilisable. La plupart des solutions existantes utilisent un index de boucle pour éviter cela. Mais vous n'avez pas besoin d'utiliser un index - la clé ici est que contrairement à une boucle for où la variable de boucle est masquée, la variable de boucle est exposée.
Vous pouvez faire des choses très similaires avec les itérateurs/générateurs:
x = [1,2,3,4,5,6]
xi = iter(x)
ival = xi.next()
while not exit_condition(ival):
# Do some ival stuff
if ival == 4:
xi = iter(x)
ival = xi.next()
Ce n'est pas aussi propre, mais conserve toujours la possibilité d'écrire sur l'itérateur de boucle lui-même.
Habituellement , quand vous pensez que vous voulez faire cela, votre algorithme est faux et vous devriez le réécrire plus proprement. Probablement ce que vous voulez vraiment faire est d’utiliser un générateur/coroutine à la place. Mais c'est au moins possible.
a = ['1', '2', '3']
ls = []
count = False
while ls != a :
print(a[count])
if a[count] != a[-1] :
count = count + 1
else :
count = False
Redémarrez en boucle.