Python: reiniciando un ciclo

yo tengo:

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

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

quizás un:

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

Es poco probable que hacer cambios en la variable de índice i desde dentro del ciclo haga lo que usted espera. Puede que necesite usar un ciclo while y controlar el incremento de la variable loop por su cuenta. Cada vez que se pasa el ciclo for , i se reasigna con el siguiente valor de range() . Entonces algo así 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 instrucción continue vuelve al principio del ciclo, salteando la instrucción i += 1 para esa iteración. De lo contrario, i se incrementa como es de esperar (igual que el bucle for ).

Aquí hay un ejemplo usando el método send() 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 

Solo quería publicar una alternativa que pudiera ser más útil genéricamente. 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.

Puedes 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 aún conserva la capacidad de escribir en el iterador de bucle en sí.

Usualmente , cuando piensas que quieres hacer esto, tu algoritmo está equivocado, y debes reescribirlo más limpiamente. Probablemente lo que realmente quieres hacer es usar un generador / coroutine en su lugar. Pero es al menos posible.

 a = ['1', '2', '3'] ls = [] count = False while ls != a : print(a[count]) if a[count] != a[-1] : count = count + 1 else : count = False 

Reinicia mientras bucle.