Rupture des boucles imbriquées [dupliquer]

possible Duplicate:

comment se libérer de boucles multiples en Python?

y a-t-il un moyen plus facile de sortir des boucles emboîtées que de lancer une exception? (En Perl, vous pouvez donner des étiquettes à chaque boucle et au moins continuer une boucle extérieure.)

for x in range(10):
    for y in range(10):
        print x*y
        if x*y > 50:
            "break both loops"

c'est-à-dire, y a-t-il un meilleur moyen que:

class BreakIt(Exception): pass

try:
    for x in range(10):
        for y in range(10):
            print x*y
            if x*y > 50:
                raise BreakIt
except BreakIt:
    pass
193
demandé sur Community 2009-03-17 12:24:17
la source

8 ответов

Il a au moins été suggéré, mais aussi rejeté . Je ne pense pas qu'il y ait une autre façon, à part répéter le test ou réorganiser le code. Il est parfois un peu ennuyeux.

dans le message de rejet , M. van Rossum mentionne l'utilisation de return , ce qui est vraiment raisonnable et quelque chose que je dois me rappeler personnellement. :)

106
répondu unwind 2009-03-17 13:09:22
la source
for x in xrange(10):
    for y in xrange(10):
        print x*y
        if x*y > 50:
            break
    else:
        continue  # only executed if the inner loop did NOT break
    break  # only executed if the inner loop DID break

les mêmes travaux pour les boucles plus profondes:

for x in xrange(10):
    for y in xrange(10):
        for z in xrange(10):
            print x,y,z
            if x*y*z == 30:
                break
        else:
            continue
        break
    else:
        continue
    break
525
répondu Markus Jarderot 2018-04-16 19:06:27
la source

si vous êtes capable d'extraire le code de boucle dans une fonction, une instruction return peut être utilisée pour sortir de la boucle la plus externe à tout moment.

def foo():
    for x in range(10):
        for y in range(10):
            print x*y
            if x*y > 50:
                return
foo()

S'il est difficile d'extraire cette fonction, vous pouvez utiliser une fonction interne, comme @bjd2385 le suggère, par exemple

def your_outer_func():
    ...
    def inner_func():
        for x in range(10):
            for y in range(10):
                print x*y
                if x*y > 50:
                    return
    inner_func()
    ...
55
répondu Mr Fooz 2016-12-05 20:02:02
la source

utiliser des outils itératifs.produit!

from itertools import product
for x, y in product(range(10), range(10)):
    #do whatever you want
    break

voici un lien vers itertools.produit dans la documentation python: http://docs.python.org/library/itertools.html#itertools.product

30
répondu Fábio Santos 2011-10-26 21:47:19
la source

parfois j'utilise une variable booléenne. Naïf, si vous voulez, mais je le trouve assez souple et confortable à lire. Tester une variable peut éviter de tester à nouveau des conditions complexes et peut également recueillir des résultats de plusieurs tests dans les boucles intérieures.

    x_loop_must_break = False
    for x in range(10):
        for y in range(10):
            print x*y
            if x*y > 50:
                x_loop_must_break = True
                break
        if x_loop_must_break: break
18
répondu Halberdier 2011-05-17 00:50:55
la source

si vous prévoyez de soulever une exception, vous pourriez soulever une exception de Stopitération . Qui aura au moins l'intention évidente.

14
répondu dbn 2012-08-14 04:31:38
la source

vous pouvez également modifier votre code pour utiliser un générateur. Mais cela ne peut être une solution pour tous les types de boucles imbriquées.

8
répondu J S 2009-03-17 13:29:00
la source

dans ce cas particulier, vous pouvez fusionner les boucles avec un python moderne (3.0 et probablement 2.6, aussi) en utilisant des itertools.produit.

j'ai pris pour moi-même ceci comme une règle de pouce, si vous nichez trop de boucles (comme dans, plus de 2), Vous êtes généralement en mesure d'extraire une des boucles dans une méthode différente ou fusionner les boucles dans une, comme dans ce cas.

3
répondu Tetha 2009-03-17 12:58:34
la source

Autres questions sur python loops