739 Stimmen

Wie kann man aus den Mehrfachschleifen ausbrechen?

Bei folgendem Code (der nicht funktioniert):

while True:
    #snip: print out current state
    while True:
        ok = get_input("Is this ok? (y/n)")
        if ok.lower() == "y": break 2 #this doesn't work :(
        if ok.lower() == "n": break
    #do more processing with menus and stuff

Gibt es eine Möglichkeit, dies zu erreichen? Oder muss ich eine Prüfung durchführen, um aus der Eingabeschleife auszubrechen, und dann eine weitere, eingeschränktere Prüfung in der äußeren Schleife, um alles zusammen auszubrechen, wenn der Benutzer zufrieden ist?

193 Stimmen

Warum gibt es in Python nicht einfach "break(n)", wobei n die Anzahl der Ebenen ist, aus denen man ausbrechen möchte.

14 Stimmen

C++ ist hier schön mit goto wenn Sie tief in eine Menge von Schleifen eingebettet sind

2 Stimmen

740voto

Robert Rossney Punkte 91100

Mein erster Instinkt wäre, die verschachtelte Schleife in eine Funktion umzuwandeln und die return um auszubrechen.

504voto

yak Punkte 4093

Hier ist ein weiterer Ansatz, der kurz ist. Der Nachteil ist, dass Sie nur die äußere Schleife unterbrechen können, aber manchmal ist es genau das, was Sie wollen.

for a in xrange(10):
    for b in xrange(20):
        if something(a, b):
            # Break the inner loop...
            break
    else:
        # Continue if the inner loop wasn't broken.
        continue
    # Inner loop was broken, break the outer.
    break

Dabei wird das for / else-Konstrukt verwendet, das unter erläutert wird: Warum verwendet Python "else" nach for- und while-Schleifen?

Wichtigste Erkenntnis: Es ist nur scheint als ob die äußere Schleife immer abbricht. Aber wenn die innere Schleife nicht abbricht, bricht auch die äußere Schleife nicht ab.

El continue Aussage ist die Magie hier. Sie befindet sich in der for-else-Klausel. Per Definition das passiert, wenn es keine innere Unterbrechung gibt. In dieser Situation continue umgeht die äußere Unterbrechung auf elegante Weise.

185voto

John Fouhy Punkte 39035

PEP 3136 schlägt die Kennzeichnung "Pause/Weiter" vor. Guido es abgelehnt weil "Code, der so kompliziert ist, dass er diese Funktion benötigt, sehr selten ist". Das PEP erwähnt jedoch einige Umgehungsmöglichkeiten (wie die Ausnahmetechnik), während Guido der Meinung ist, dass eine Umstrukturierung zur Verwendung von return in den meisten Fällen einfacher sein wird.

163voto

S.Lott Punkte 371691

Zunächst ist die gewöhnliche Logik hilfreich.

Wenn aus irgendeinem Grund die Bedingungen für die Beendigung des Arbeitsverhältnisses nicht geklärt werden können, sind Ausnahmen ein Ausweichplan.

class GetOutOfLoop( Exception ):
    pass

try:
    done= False
    while not done:
        isok= False
        while not (done or isok):
            ok = get_input("Is this ok? (y/n)")
            if ok in ("y", "Y") or ok in ("n", "N") : 
                done= True # probably better
                raise GetOutOfLoop
        # other stuff
except GetOutOfLoop:
    pass

Für dieses spezielle Beispiel ist eine Ausnahme möglicherweise nicht erforderlich.

Andererseits gibt es in Anwendungen im Zeichenmodus oft die Optionen "Y", "N" und "Q". Bei der Option "Q" wollen wir eine sofortige Beendigung. Das ist eher die Ausnahme.

75voto

krvolok Punkte 671

Führen Sie eine neue Variable ein, die Sie als "Schleifenunterbrecher" verwenden werden. Weisen Sie ihr zunächst einen Wert zu (False, 0 usw.), und ändern Sie dann innerhalb der äußeren Schleife, bevor Sie die Schleife verlassen, den Wert in einen anderen (True, 1 usw.). Sobald die Schleife beendet ist, lassen Sie die "übergeordnete" Schleife auf diesen Wert prüfen. Lassen Sie mich das demonstrieren:

breaker = False #our mighty loop exiter!
while True:
    while True:
        if conditionMet:
            #insert code here...
            breaker = True 
            break
    if breaker: # the interesting part!
        break   # <--- !

Wenn Sie eine Endlosschleife haben, ist dies der einzige Ausweg; bei anderen Schleifen ist die Ausführung wirklich viel schneller. Dies funktioniert auch, wenn Sie viele verschachtelte Schleifen haben. Sie können alle oder nur einige wenige beenden. Unendliche Möglichkeiten! Ich hoffe, das hat geholfen!

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