Как я могу остановить цикл while?

Я написал 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
15.12.2008 14:35:02
проблема в вашем вопросе. «когда оно не соответствует своему окончательному состоянию ..». Вы не проверяете конечное условие, вы говорите «пока истина:». Истина всегда будет Истиной.
theman_on_vista 15.12.2008 14:57:19
спасибо за ваш комментарий, я почти наполовину знаю о цикле while .. так что на самом деле не знаю, как задать хороший вопрос ..
NONEenglisher 15.12.2008 15:02:30
4 ОТВЕТА
РЕШЕНИЕ

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

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
19
15.12.2008 15:04:14
да, потому что в вашем коде была другая ошибка: оператор break, который мешал вашей функции что-то вернуть. Я удалил это сейчас.
Mapad 15.12.2008 14:44:09
но теперь он всегда возвращает 0 ... спасибо большое, хотя ~~~
NONEenglisher 15.12.2008 14:51:32
не проверять, является ли что-то () Истинным: проверять объект напрямую, как в «if numpy.array_equal (tmp, universe_array):»
nosklo 15.12.2008 16:07:16
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
8
15.12.2008 14:51:09
+1, но было бы неплохо указать, что + почему, «в то время как истина» eeek
annakata 15.12.2008 14:41:39
Цикл кода Джоэля до периода 12, чем остановка цикла и возврат периода ... это нормально ... Код Джоэля не то, что вам нужно
Patrick Desjardins 15.12.2008 14:51:04
Это ближе. И да, я ожидаю, что он подумает и о себе.
Joel Coehoorn 15.12.2008 14:52:19
Будьте осторожны: это все равно не вернет то, что вы хотите, если условие if не выполняется. Я оставляю этот последний пункт в качестве упражнения для читателя.
Joel Coehoorn 15.12.2008 15:01:12
@Joel Coehoorn, я не могу остановиться, чтобы сказать, что ты действительно хороший учитель! Люби эту формулу, потому что в ней так много учителей, как ты.
NONEenglisher 15.12.2008 15:05:06

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

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

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

    if numpy.array_equal(tmp,universe_array):
        break

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

3
15.12.2008 18:03:02

Я бы сделал это с помощью цикла 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
0
16.12.2008 19:03:27