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
Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top