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

12voto

Es gibt keine Möglichkeit, dies auf sprachlicher Ebene zu tun. Einige Sprachen haben ein goto andere haben ein break, das ein Argument benötigt, Python nicht.

Die besten Optionen sind:

  1. Setzen Sie ein Flag, das von der äußeren Schleife geprüft wird, oder setzen Sie die Bedingung der äußeren Schleife Bedingung.

  2. Fügen Sie die Schleife in eine Funktion ein und verwenden Sie return, um alle Schleifen auf einmal zu verlassen.

  3. Formulieren Sie Ihre Logik neu.

Der Dank geht an Vivek Nagarajan, Programmierer seit 1987


Funktion verwenden

def doMywork(data):
    for i in data:
       for e in i:
         return 

Flagge verwenden

is_break = False
for i in data:
   if is_break:
      break # outer loop break
   for e in i:
      is_break = True
      break # inner loop break

12voto

Mauro Punkte 747

Schleife fortsetzen, wenn zwei Bedingungen erfüllt sind.

Ich denke, dies ist ein eher pythonischer Weg:

dejaVu = True

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

8voto

Fügen Sie Ihre Schleifenlogik in einen Iterator ein, der die Schleifenvariablen liefert und zurückkehrt, wenn er fertig ist. Hier ist ein einfaches Beispiel, das Bilder in Zeilen/Spalten anordnet, bis wir keine Bilder mehr haben oder keine Plätze mehr, um sie zu platzieren:

def it(rows, cols, images):
    i = 0
    for r in xrange(rows):
        for c in xrange(cols):
            if i >= len(images):
                return
            yield r, c, images[i]
            i += 1 

for r, c, image in it(rows=4, cols=4, images=['a.jpg', 'b.jpg', 'c.jpg']):
    ... do something with r, c, image ...

Dies hat den Vorteil, dass die komplizierte Schleifenlogik und die Verarbeitung aufgespalten werden...

6voto

one_observation Punkte 434

Eine einfache Möglichkeit, mehrere Schleifen in eine einzige, abbrechbare Schleife zu verwandeln, ist die Verwendung von numpy.ndindex

for i in range(n):
  for j in range(n):
    val = x[i, j]
    break # still inside the outer loop!

for i, j in np.ndindex(n, n):
  val = x[i, j]
  break # you left the only loop there was!

Sie müssen Ihre Objekte indizieren, im Gegensatz zu einer expliziten Iteration durch die Werte, aber zumindest in einfachen Fällen scheint es etwa 2-20 Mal einfacher zu sein als die meisten der vorgeschlagenen Antworten.

5voto

holroy Punkte 2847

Es gibt einen versteckten Trick in der Python while ... else Struktur, die zur Simulation der doppelten Unterbrechung ohne große Codeänderungen/-ergänzungen verwendet werden kann. Im Grunde genommen, wenn die while Bedingung falsch ist, wird die else Block ausgelöst wird. Weder Ausnahmen, continue ou break Auslösen der else blockieren. Weitere Informationen finden Sie in den Antworten auf " Else-Klausel in der Python-Anweisung while ", oder Python-Dokumentation über while (v2.7) .

while True:
    #snip: print out current state
    ok = ""
    while ok != "y" and ok != "n":
        ok = get_input("Is this ok? (y/n)")
        if ok == "n" or ok == "N":
            break    # Breaks out of inner loop, skipping else

    else:
        break        # Breaks out of outer loop

    #do more processing with menus and stuff

Der einzige Nachteil ist, dass Sie die doppelte Bruchbedingung in die while Bedingung (oder fügen Sie eine Flag-Variable hinzu). Variationen hiervon gibt es auch für die for Schleife, in der die else Block wird nach Abschluss der Schleife ausgelöst.

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