python - barplot - pandas plot
Python: reiniciando un ciclo (5)
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 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
).
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
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.