web-dev-qa-db-fra.com

Python - `break` de toutes les boucles

J'utilise plusieurs boucles imbriquées for. Dans la dernière boucle, il y a une instruction if. Lorsqu'elle est évaluée à True, toutes les boucles for doivent s'arrêter, mais cela ne se produit pas. Il ne fait que break en dehors de la boucle for la plus intérieure, et continue. J'ai besoin que toutes les boucles s'arrêtent si l'instruction break est rencontrée.

Mon code:

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

Vous devez mettre vos boucles dans une fonction, puis retourner:

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

L'utilisation de return quitte immédiatement la fonction englobante. Dans le processus, toutes les boucles seront arrêtées.

45
iCodez

Vous pouvez soulever une exception

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

pourquoi ne pas utiliser une expression de générateur:

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

Je ne sais pas si c'est la manière la plus propre possible de le faire, mais vous pouvez faire une vérification booléenne en haut de chaque boucle.

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