Как я могу остановить цикл while? - PullRequest
11 голосов
/ 15 декабря 2008

Я написал while loop в функции, но не знаю, как это остановить. Когда он не соответствует своему окончательному состоянию, цикл просто идет навсегда. Как я могу это остановить?

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

Ответы [ 4 ]

16 голосов
/ 15 декабря 2008

просто сделайте отступ в своем коде правильно:

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

Вы должны понимать, что оператор break в вашем примере выйдет из бесконечного цикла, который вы создали с помощью while True. Поэтому, когда условие прерывания равно True, программа выйдет из бесконечного цикла и перейдет к следующему кадру с отступом. Поскольку в вашем коде нет следующего блока, функция завершается и ничего не возвращает. Итак, я исправил ваш код, заменив оператор break на оператор return.

Следуя вашей идее использовать бесконечный цикл, это лучший способ написать это:

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
8 голосов
/ 15 декабря 2008
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
2 голосов
/ 15 декабря 2008

Оператор is в Python, вероятно, не делает то, что вы ожидаете. Вместо этого:

    if numpy.array_equal(tmp,universe_array) is True:
        break

Я бы написал так:

    if numpy.array_equal(tmp,universe_array):
        break

Оператор is проверяет идентичность объекта, которая сильно отличается от равенства.

0 голосов
/ 16 декабря 2008

Я бы сделал это с помощью цикла for, как показано ниже:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...