433 Stimmen

Ausbrechen aus verschachtelten Schleifen

Gibt es einen einfacheren Weg, um aus verschachtelten Schleifen auszubrechen, als eine Exception zu werfen? (In Perl kann man jeder Schleife ein Label geben und zumindest eine äußere Schleife fortsetzen).

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

D.h., gibt es einen schöneren Weg als:

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

1013voto

Markus Jarderot Punkte 83090
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

Das Gleiche gilt für tiefere Schleifen:

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

216voto

unwind Punkte 377331

Es wurde zumindest vorgeschlagen, aber auch abgelehnt . Ich glaube nicht, dass es eine andere Möglichkeit gibt, außer den Test zu wiederholen oder den Code umzugestalten. Es ist manchmal ein bisschen ärgerlich.

In der Ablehnungsmeldung erwähnt Herr van Rossum die Verwendung von return was wirklich sinnvoll ist und woran ich mich persönlich erinnern muss :)

94voto

Mr Fooz Punkte 102791

Wenn Sie in der Lage sind, den Schleifencode in eine Funktion zu extrahieren, kann eine return Anweisung kann die äußerste Schleife jederzeit verlassen werden.

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

Wenn es schwierig ist, diese Funktion zu extrahieren, können Sie eine innere Funktion verwenden, wie @bjd2385 vorschlägt, z. B.

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()
    ...

61voto

Fábio Santos Punkte 3591

Verwenden Sie itertools.product!

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

Hier ist ein Link zu itertools.product in der Python-Dokumentation: http://docs.python.org/library/itertools.html#itertools.product

Sie können auch in einer Schleife über ein Array comprehension mit 2 fors darin und Pause, wann immer Sie wollen.

>>> [(x, y) for y in ['y1', 'y2'] for x in ['x1', 'x2']]
[
    ('x1', 'y1'), ('x2', 'y1'),
    ('x1', 'y2'), ('x2', 'y2')
]

53voto

Halberdier Punkte 1066

Manchmal verwende ich eine boolesche Variable. Naiv, wenn Sie wollen, aber ich finde es ziemlich flexibel und bequem zu lesen. Durch das Testen einer Variablen kann man das erneute Testen komplexer Bedingungen vermeiden und die Ergebnisse mehrerer Tests in inneren Schleifen sammeln.

    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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X