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

1voto

Daniel L. Punkte 1

Hoffentlich hilft das:

x = True
y = True
while x == True:
    while y == True:
         ok = get_input("Is this ok? (y/n)") 
         if ok == "y" or ok == "Y":
             x,y = False,False #breaks from both loops
         if ok == "n" or ok == "N": 
             break #breaks from just one

1voto

Charlie Clark Punkte 16276

Ich bin vor kurzem darauf gestoßen und habe mir die Idee von @yak angesehen, weil ich eine doppelte Return-Anweisung vermeiden wollte, die logische Fehler verbergen kann. Dies funktioniert gut in verschachtelten for-Schleifen, ist aber nicht sehr elegant. Eine Alternative wäre, die Bedingung vor der nächsten Schleife zu prüfen:

b = None
for a in range(10):
    if something(a, b): # should never = True if b is None
        break
    for b in range(20):
        pass

Dies mag nicht überall funktionieren, ist aber anpassungsfähig und hat den Vorteil, dass die Bedingung bei Bedarf dupliziert werden kann und nicht nur ein mögliches Ergebnis darstellt.

1voto

helmsdeep Punkte 11

Sie können eine Variable definieren (zum Beispiel break_statement ), dann ändern Sie es auf einen anderen Wert, wenn zwei-Break-Bedingung auftritt und verwenden Sie es in if-Anweisung, um aus der zweiten Schleife auch zu brechen.

while True:
    break_statement=0
    while True:
        ok = raw_input("Is this ok? (y/n)")
        if ok == "n" or ok == "N": 
            break
        if ok == "y" or ok == "Y": 
            break_statement=1
            break
    if break_statement==1:
        break

1voto

Nathan Garabedian Punkte 729

Der Grund, warum ich hierher komme, ist, dass ich eine äußere Schleife und eine innere Schleife wie folgt hatte:

for x in array:
  for y in dont_use_these_values:
    if x.value==y:
      array.remove(x)  # fixed, was array.pop(x) in my original answer
      continue

  do some other stuff with x

Wie Sie sehen, wird nicht zum nächsten x, sondern zum nächsten y gesprungen.

Ich habe herausgefunden, dass man das Problem einfach lösen kann, indem man das Array zweimal durchläuft:

for x in array:
  for y in dont_use_these_values:
    if x.value==y:
      array.remove(x)  # fixed, was array.pop(x) in my original answer
      continue

for x in array:
  do some other stuff with x

Ich weiß, dass dies ein spezieller Fall der Frage von OP war, aber ich stelle es in der Hoffnung ein, dass es jemandem hilft, sein Problem anders zu betrachten und dabei die Dinge einfach zu halten.

1voto

Skycc Punkte 3365

Wahrscheinlich kleinen Trick wie unten wird tun, wenn nicht lieber refactorial in Funktion

1 break_level-Variable zur Steuerung der while-Schleifenbedingung hinzugefügt

break_level = 0
# while break_level < 3: # if we have another level of nested loop here
while break_level < 2:
    #snip: print out current state
    while break_level < 1:
        ok = get_input("Is this ok? (y/n)")
        if ok == "y" or ok == "Y": break_level = 2 # break 2 level
        if ok == "n" or ok == "N": break_level = 1 # break 1 level

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