web-dev-qa-db-fra.com

python: redémarrer une boucle

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

16
cbrulak

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  
28
gnomed

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).

13
Greg Hewgill

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
3
Joel Cornett

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. 

1
Corley Brigman
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.

0
BrunoC7