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

4voto

Loax Punkte 605

In diesem Fall ist, wie auch von anderen betont, die funktionale Zerlegung der richtige Weg. Code in Python 3:

def user_confirms():
    while True:
        answer = input("Is this OK? (y/n) ").strip().lower()
        if answer in "yn":
            return answer == "y"

def main():
    while True:
        # do stuff
        if user_confirms():
            break

4voto

Rafiq Punkte 984

Durch die Verwendung einer Funktion:

def myloop():
    for i in range(1,6,1):  # 1st loop
        print('i:',i)
        for j in range(1,11,2):  # 2nd loop
            print('   i, j:' ,i, j)
            for k in range(1,21,4):  # 3rd loop
                print('      i,j,k:', i,j,k)
                if i%3==0 and j%3==0 and k%3==0:
                    return  # getting out of all loops

myloop()

Versuchen Sie, die oben genannten Codes auszuführen, indem Sie die return auch.

Ohne eine Funktion zu verwenden:

done = False
for i in range(1,6,1):  # 1st loop
    print('i:', i)
    for j in range(1,11,2):  # 2nd loop
        print('   i, j:' ,i, j)
        for k in range(1,21,4):  # 3rd loop
            print('      i,j,k:', i,j,k)
            if i%3==0 and j%3==0 and k%3==0:
                done = True
                break  # breaking from 3rd loop
        if done: break # breaking from 2nd loop
    if done: break     # breaking from 1st loop

Führen Sie die obigen Codes zunächst unverändert aus und versuchen Sie dann, jede Zeile mit break einer nach dem anderen von unten.

3voto

Peeyush Kushwaha Punkte 3236

Eine andere Möglichkeit, die Iteration auf eine einstufige Schleife zu reduzieren, wäre die Verwendung von Generatoren, wie sie auch in der Python-Referenz

for i, j in ((i, j) for i in A for j in B):
    print(i , j)
    if (some_condition):
        break

Sie können die Schleife auf eine beliebige Anzahl von Ebenen erweitern

Der Nachteil ist, dass man nicht mehr nur eine einzige Stufe brechen kann. Es geht um alles oder nichts.

Ein weiterer Nachteil ist, dass es nicht mit einer while-Schleife funktioniert. Ich wollte diese Antwort ursprünglich auf Python - `Ausbrechen` aus allen Schleifen aber leider ist es als Duplikat von diesem hier geschlossen

3voto

user Punkte 19524

Ich möchte Sie daran erinnern, dass Funktionen in Python direkt in der Mitte des Codes erstellt werden können und transparent auf die umgebenden Variablen zugreifen können, um sie zu lesen und mit nonlocal ou global Erklärung zum Schreiben.

Sie können also eine Funktion als "abbrechbare Kontrollstruktur" verwenden, die eine Stelle definiert, zu der Sie zurückkehren wollen:

def is_prime(number):

    foo = bar = number

    def return_here():
        nonlocal foo, bar
        init_bar = bar
        while foo > 0:
            bar = init_bar
            while bar >= foo:
                if foo*bar == number:
                    return
                bar -= 1
            foo -= 1

    return_here()

    if foo == 1:
        print(number, 'is prime')
    else:
        print(number, '=', bar, '*', foo)

>>> is_prime(67)
67 is prime
>>> is_prime(117)
117 = 13 * 9
>>> is_prime(16)
16 = 4 * 4

2voto

kcEmenike Punkte 132

Was ich persönlich tun würde, ist ein Boolescher Wert, der umschaltet, wenn ich bereit bin, die äußere Schleife zu verlassen. Zum Beispiel

while True:
    #snip: print out current state
    quit = False
    while True:
        ok = input("Is this ok? (y/n)")
        if ok.lower() == "y":
            quit = True
            break # this should work now :-)
        if ok.lower() == "n":
            quit = True
            break # This should work too :-)
    if quit:
        break
    #do more processing with menus and stuff

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