Da diese Frage zu einer Standardfrage für den Einstieg in eine bestimmte Schleife geworden ist, möchte ich meine Antwort anhand eines Beispiels geben Exception
.
Obwohl es keine Kennzeichnung für die Unterbrechung einer Schleife in einem Konstrukt mit mehreren Schleifen gibt, können wir die folgende Methode verwenden Benutzerdefinierte Ausnahmen um in eine bestimmte Schleife unserer Wahl einzubrechen. Betrachten wir das folgende Beispiel, in dem wir alle Zahlen bis zu 4 Ziffern im Basis-6-Nummerierungssystem ausgeben wollen:
class BreakLoop(Exception):
def __init__(self, counter):
Exception.__init__(self, 'Exception 1')
self.counter = counter
for counter1 in range(6): # Make it 1000
try:
thousand = counter1 * 1000
for counter2 in range(6): # Make it 100
try:
hundred = counter2 * 100
for counter3 in range(6): # Make it 10
try:
ten = counter3 * 10
for counter4 in range(6):
try:
unit = counter4
value = thousand + hundred + ten + unit
if unit == 4 :
raise BreakLoop(4) # Don't break from loop
if ten == 30:
raise BreakLoop(3) # Break into loop 3
if hundred == 500:
raise BreakLoop(2) # Break into loop 2
if thousand == 2000:
raise BreakLoop(1) # Break into loop 1
print('{:04d}'.format(value))
except BreakLoop as bl:
if bl.counter != 4:
raise bl
except BreakLoop as bl:
if bl.counter != 3:
raise bl
except BreakLoop as bl:
if bl.counter != 2:
raise bl
except BreakLoop as bl:
pass
Wenn wir die Ausgabe ausdrucken, werden wir nie einen Wert erhalten, dessen Einheitsstelle bei 4 liegt. In diesem Fall brechen wir nicht aus einer Schleife ab, da BreakLoop(4)
wird ausgelöst und in derselben Schleife aufgefangen. Ähnlich verhält es sich mit der dritten Schleife, wenn die zehnte Stelle eine 3 hat. BreakLoop(3)
. Immer wenn die hundertste Stelle 5 hat, gehen wir in die zweite Schleife über BreakLoop(2)
und wenn die tausendste Stelle 2 hat, brechen wir in die erste Schleife mit BreakLoop(1)
.
Kurz gesagt, lösen Sie Ihre Exception (eingebaut oder benutzerdefiniert) in den inneren Schleifen aus und fangen Sie sie in der Schleife ab, in der Sie die Kontrolle wieder aufnehmen wollen. Wenn Sie alle Schleifen unterbrechen wollen, fangen Sie die Exception außerhalb aller Schleifen ab. (Ich habe diesen Fall im Beispiel nicht gezeigt).
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 sind2 Stimmen
@Nathan See Warum Python nicht nativ erlauben ein Schlüsselwort wie goto für den Ausbruch aus n Schleifen eine sehr schöne Erklärung von Nathan
4 Stimmen
Ned Batchelder hält diesen interessanten Vortrag, in dem es um "Wie komme ich aus zwei Schleifen heraus?" . Spoiler-Alarm: Machen Sie die Doppelschlaufe einfach.