2009-01-29 7 views
12

i ont:python: redémarrer une boucle

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 a-t-il un moyen de redémarrer cette boucle?

Merci

Répondre

25

Vous pouvez envisager d'utiliser un type de boucle différent lorsque cette logique est applicable, car c'est la réponse la plus évidente.

peut-être:

i=2 
while i < n: 
    if something: 
     do something 
     i += 1 
    else: 
     do something else 
     i = 2 #restart the loop 
+1

merci Perrow, pas beaucoup d'une personne python ... encore. – gnomed

+0

Juste un rappel: avec une boucle while, assurez-vous que vous avez une condition de terminaison qui peut toujours être satisfaite. – Brandon

+0

Je pense que cela se terminera quand i> = n – gnomed

10

Modification de l'index de variable i à l'intérieur de la boucle est peu probable de faire 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, le dos saute déclaration continue au sommet de la boucle, en sautant l'instruction i += 1 pour cette itération. Sinon, i est incrémenté comme vous le souhaitez (identique à la boucle for).

0

Je voulais juste poster une alternative qui pourrait être plus genearally 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 cachée, la variable de boucle est exposée.

Vous pouvez faire des choses très similaires avec 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 à la boucle iterator 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.

3

Voici un exemple en utilisant un générateur de send() method:

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 
0
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émarrer en boucle.