Gibt es ein label/goto in Python?

Gibt es ein goto oder ein Äquivalent in Python, mit dem man zu einer bestimmten Codezeile springen kann?

Nein, Python unterstützt keine Etiketten und goto, wenn das ist, was Sie ' re nach. Es ist eine (stark) strukturierte Programmiersprache.

Kommentare (3)

Python bietet Ihnen die Möglichkeit, einige der Dinge, die Sie mit einem goto tun könnten, mit Funktionen erster Klasse zu tun. Zum Beispiel:

void somefunc(int a)
{
    if (a == 1)
        goto label1;
    if (a == 2)
        goto label2;

    label1:
        ...
    label2:
        ...
}

Könnte in Python wie folgt gemacht werden:

def func1():
    ...

def func2():
    ...

funcmap = {1 : func1, 2 : func2}

def somefunc(a):
    funcmap[a]()  #Ugly!  But it works.

Zugegeben, das ist nicht der beste Weg, um goto zu ersetzen. Aber ohne genau zu wissen, was Sie mit dem goto machen wollen, ist es schwer, konkrete Ratschläge zu geben.

@ascobol:

Am besten ist es, ihn entweder in eine Funktion einzuschließen oder eine Ausnahme zu verwenden. Für die Funktion:

def loopfunc():
    while 1:
        while 1:
            if condition:
                return

Für die Ausnahme:

try:
    while 1:
        while 1:
            raise BreakoutException #Not a real exception, invent your own
except BreakoutException:
    pass

Die Verwendung von Ausnahmen für solche Dinge mag sich etwas unbeholfen anfühlen, wenn man aus einer anderen Programmiersprache kommt. Aber ich würde behaupten, dass Python nicht die richtige Sprache für Sie ist, wenn Sie keine Ausnahmen verwenden wollen :-)

Kommentare (2)

Um die Frage von @ascobol's zu beantworten, benutze ich @bobince's Vorschlag aus den Kommentaren:

for i in range(5000):
    for j in range(3000):
        if should_terminate_the_loop:
           break
    else: 
        continue # no break encountered
    break

Der Einzug für den else-Block ist korrekt. Der Code verwendet die obskure Python-Syntax else nach einer Schleife. Siehe Why does python use 'else' after for and while loops?

Kommentare (7)