web-dev-qa-db-ja.com

Python-すべてのループから抜け出す

複数のネストされたforループを使用しています。最後のループには、ifステートメントがあります。 Trueと評価されると、すべてのforループが停止するはずですが、それは起こりません。それは、最も内側のbreakループからforsだけで、それ以上継続しません。 breakステートメントが検出された場合、すべてのループが停止する必要があります。

私のコード:

for i in range(1, 1001):
    for i2 in range(i, 1001):
        for i3 in range(i2, 1001):
            if i*i + i2*i2 == i3*i3 and i + i2 + i3 == 1000:
                print i*i2*i3
                break
24
Vader

ループを関数内に入れてから返してください:

def myfunc():
    for i in range(1, 1001):
        for i2 in range(i, 1001):
            for i3 in range(i2, 1001):
                if i*i + i2*i2 == i3*i3 and i + i2 + i3 == 1000:
                    print i*i2*i3
                    return # Exit the function (and stop all of the loops)
myfunc() # Call the function

return を使用すると、すぐに囲んでいる関数が終了します。このプロセスでは、すべてのループが停止します。

45
iCodez

例外を発生させることができます

try:
    for a in range(5):
        for b in range(5):
            if a==b==3:
                raise StopIteration
            print b
except StopIteration: pass
15
dugres

ジェネレータ式を使用しない理由:

def my_iterator()
    for i in range(1, 1001):
        for i2 in range(i, 1001):
            for i3 in range(i2, 1001):
                yield i,i2,i3

for i,i2,i3 in my_iterator():
    if i*i + i2*i2 == i3*i3 and i + i2 + i3 == 1000:
        print i*i2*i3
        break
9
greole

これが最もクリーンな方法であるかどうかはわかりませんが、すべてのループの先頭でブールチェックを行うことができます。

do_loop = True

for i in range(1, 1001):
    if not do_loop:
        break
    for i2 in range(i, 1001):
        # [Loop code here]
        # set do_loop to False to break parent loops
1
andrewgrz