2009-01-29 22 views
12

que tengo:pitón: reiniciar un bucle

for i in range(2,n): 
    if(something): 
     do something 
    else: 
     do something else 
     i = 2 **restart the loop 

Pero eso no parece funcionar. ¿Hay alguna manera de reiniciar ese ciclo?

Gracias

Respuesta

25

Es posible que desee considerar el uso de un tipo de bucle diferente donde esa lógica es aplicable, porque es la respuesta más obvia.

tal vez un:

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

gracias Perrow, no mucho de una persona de pitón ... todavía. – gnomed

+0

Solo un recordatorio: con un ciclo while, asegúrese de tener una condición de terminación que siempre se puede cumplir. – Brandon

+0

Creo que esto terminará cuando i> = n – gnomed

10

Cambio de la variable índice i desde dentro del bucle es poco probable que haga lo que usted espera. Puede que necesite usar un bucle while y controlar el incremento de la variable de bucle usted mismo. En cada vuelta al for se reasigna i con el siguiente valor desde range(). Así que algo como:

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

En mi ejemplo, la declaración continue salta de nuevo a la parte superior del bucle, omitiendo la declaración i += 1 para esa iteración. De lo contrario, i se incrementa como es de esperar (igual que el bucle for).

0

Sólo quería publicar una alternativa que podría ser más genearally utilizable. La mayoría de las soluciones existentes usan un índice de ciclo para evitar esto. Pero no tiene que usar un índice; la clave aquí es que, a diferencia de un bucle for, donde la variable de bucle está oculta, la variable de bucle está expuesta.

Se pueden hacer cosas muy similares con iteradores/generadores:

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

No es tan limpio, pero todavía conserva la capacidad de escribir en el mismo repetidor de bucle.

Por lo general,, cuando crea que desea hacer esto, su algoritmo está equivocado, y debe volver a escribirlo más limpiamente. Probablemente lo que realmente quieres hacer es usar un generador/coroutine en su lugar. Pero es al menos posible.

3

Aquí se muestra un ejemplo usando de send() method un generador:

def restartable(seq): 
    while True: 
     for item in seq: 
      restart = yield item 
      if restart: 
       break 
     else: 
      raise StopIteration 

Ejemplo de Uso:

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 

Restart mientras bucle.