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
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
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
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
).
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.
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
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.
gracias Perrow, no mucho de una persona de pitón ... todavía. – gnomed
Solo un recordatorio: con un ciclo while, asegúrese de tener una condición de terminación que siempre se puede cumplir. – Brandon
Creo que esto terminará cuando i> = n – gnomed