Python - "pause" de toutes les boucles [dupliquer]

cette question a déjà une réponse ici:

  • comment se libérer de boucles multiples en Python? 28 réponses

j'utilise des boucles multiples imbriquées for . Dans la dernière boucle il y a une déclaration if . Lorsque évalué à True tous les for les boucles devraient s'arrêter, mais cela n'arrive pas. Il seulement break s de la boucle la plus interne for , et qu'il continue sur la route. J'ai besoin que toutes les boucles s'arrêtent si la déclaration 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
20
demandé sur Vader 2014-01-23 00:30:52

4 réponses

vous devez mettre vos boucles à l'intérieur d'une fonction et ensuite 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

utilisant return sort immédiatement de la fonction de fermeture. Dans le processus, toutes les boucles seront arrêtés.

40
répondu iCodez 2014-01-22 20:33:15

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
12
répondu dugres 2014-01-22 20:37:55

pourquoi ne pas utiliser une expression génératrice:

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
8
répondu greole 2014-01-23 10:59:05

pas sûr si c'est la façon la plus propre possible de le faire, mais vous pourriez faire un contrôle de bool au sommet 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
répondu andrewgrz 2014-01-22 20:39:21