web-dev-qa-db-ja.com

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
12
NONEenglisher

コードを正しくインデントしてください:

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
17
Mapad
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
Joel Coehoorn

Pythonのis演算子はおそらくあなたが期待することをしないでしょう。これの代わりに:

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

次のように書きます。

    if numpy.array_equal(tmp,universe_array):
        break

is演算子は、オブジェクトの同一性をテストします。これは、等価性とはまったく異なるものです。

2
Greg Hewgill

以下に示すように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
Suraj