Como posso parar um loop While?
-
21-08-2019 - |
Pergunta
Eu escrevi um while loop
em uma função, mas não sei como pará-lo. Quando ele não cumprir sua condição final, o loop apenas ir para sempre. Como posso parar com isso?
def determine_period(universe_array):
period=0
tmp=universe_array
while True:
tmp=apply_rules(tmp)#aplly_rules is a another function
period+=1
if numpy.array_equal(tmp,universe_array) is True:
break #i want the loop to stop and return 0 if the
#period is bigger than 12
if period>12: #i wrote this line to stop it..but seems it
#doesnt work....help..
return 0
else:
return period
Solução
apenas recuar seu código corretamente:
def determine_period(universe_array):
period=0
tmp=universe_array
while True:
tmp=apply_rules(tmp)#aplly_rules is a another function
period+=1
if numpy.array_equal(tmp,universe_array) is True:
return period
if period>12: #i wrote this line to stop it..but seems its doesnt work....help..
return 0
else:
return period
Você precisa entender que a declaração break
no seu exemplo vai sair do loop infinito que você criou com while True
. Então, quando a condição de pausa é verdadeira, o programa vai sair do loop infinito e continuar para o próximo bloco recuado. Como não há seguinte bloco em seu código, as extremidades de função e não retornam nada. Então eu fixo o seu código, substituindo a declaração break
por uma declaração return
.
Após a sua ideia de usar um loop infinito, esta é a melhor maneira de escrevê-lo:
def determine_period(universe_array):
period=0
tmp=universe_array
while True:
tmp=apply_rules(tmp)#aplly_rules is a another function
period+=1
if numpy.array_equal(tmp,universe_array) is True:
break
if period>12: #i wrote this line to stop it..but seems its doesnt work....help..
period = 0
break
return period
Outras dicas
def determine_period(universe_array):
period=0
tmp=universe_array
while period<12:
tmp=apply_rules(tmp)#aplly_rules is a another function
if numpy.array_equal(tmp,universe_array) is True:
break
period+=1
return period
O operador is
em Python provavelmente não faz o que você espera. Em vez disso:
if numpy.array_equal(tmp,universe_array) is True:
break
Eu escrevê-lo como este:
if numpy.array_equal(tmp,universe_array):
break
O is
testes operador identidade de objeto, que é algo bem diferente de igualdade.
Eu faria isso usando um loop for como mostrado abaixo:
def determine_period(universe_array):
tmp = universe_array
for period in xrange(1, 13):
tmp = apply_rules(tmp)
if numpy.array_equal(tmp, universe_array):
return period
return 0