1717 Stimmen

Ersetzungen für switch-Anweisung in Python?

Ich möchte eine Funktion in Python schreiben, die je nach dem Wert eines Eingabeindexes verschiedene feste Werte zurückgibt.

In anderen Sprachen würde ich ein switch o case Anweisung, aber Python scheint nicht über eine switch Aussage. Was sind die empfohlenen Python-Lösungen in diesem Szenario?

77 Stimmen

PEP zum Thema, verfasst von Guido selbst: PEP 3103

28 Stimmen

@chb In diesem PEP erwähnt Guido nicht, dass if/elif-Ketten auch eine klassische Fehlerquelle sind. Es ist ein sehr anfälliges Konstrukt.

15 Stimmen

Was bei allen Lösungen fehlt, ist die Erkennung von doppelte Fallwerte . Als Fail-Fast-Prinzip kann dies ein größerer Verlust sein als die Leistung oder die Fallthrough-Funktion.

14voto

Yster Punkte 2829

Ich war ziemlich verwirrt, nachdem ich die akzeptierte Antwort gelesen hatte, aber das hier klärte alles auf:

def numbers_to_strings(argument):
    switcher = {
        0: "zero",
        1: "one",
        2: "two",
    }
    return switcher.get(argument, "nothing")

Dieser Code ist analog zu:

function(argument){
    switch(argument) {
        case 0:
            return "zero";
        case 1:
            return "one";
        case 2:
            return "two";
        default:
            return "nothing";
    }
}

Prüfen Sie die Fuente für weitere Informationen über die Zuordnung von Wörterbüchern zu Funktionen.

0 Stimmen

Welche Antwort lesen? Es gibt mehr als eine.

0 Stimmen

@PeterMortensen - Die akzeptierte Antwort......hat das Problem behoben.

13voto

user5224656 Punkte 129
# simple case alternative

some_value = 5.0

# this while loop block simulates a case block

# case
while True:

    # case 1
    if some_value > 5:
        print ('Greater than five')
        break

    # case 2
    if some_value == 5:
        print ('Equal to five')
        break

    # else case 3
    print ( 'Must be less than 5')
    break

12voto

Vikhyat Agarwal Punkte 1501
def f(x):
    dictionary = {'a':1, 'b':2, 'c':3}
    return dictionary.get(x,'Not Found') 
##Returns the value for the letter x;returns 'Not Found' if x isn't a key in the dictionary

0 Stimmen

Erwägen Sie eine kurze Beschreibung Ihres Codes und wie er die gestellte Frage löst

0 Stimmen

Okay, ich habe jetzt einen Kommentar dazu geschrieben.

10voto

guneysus Punkte 5747

Ich mochte Die Antwort von Mark Bies

Da die x Variable zweimal verwendet werden muss, habe ich die Lambda-Funktionen auf parameterlos umgestellt.

Ich muss mit results[value](value)

In [2]: result = {
    ...:   'a': lambda x: 'A',
    ...:   'b': lambda x: 'B',
    ...:   'c': lambda x: 'C'
    ...: }
    ...: result['a']('a')
    ...: 
Out[2]: 'A'

In [3]: result = {
    ...:   'a': lambda : 'A',
    ...:   'b': lambda : 'B',
    ...:   'c': lambda : 'C',
    ...:   None: lambda : 'Nothing else matters'

    ...: }
    ...: result['a']()
    ...: 
Out[3]: 'A'

Bearbeiten: Ich habe festgestellt, dass ich Folgendes verwenden kann None Typ mit mit Wörterbüchern. Dies würde also emulieren switch ; case else

0 Stimmen

Emuliert der Fall None nicht einfach result[None]() ?

0 Stimmen

Ja, genau. Ich meine result = {'a': 100, None:5000}; result[None]

4 Stimmen

Ich wollte nur sicherstellen, dass niemand denkt None: verhält sich wie default: .

9voto

Solomon Ucko Punkte 3858

Einfach, nicht getestet; jede Bedingung wird unabhängig ausgewertet: es gibt kein Fall-Through, aber alle Fälle werden ausgewertet (obwohl der Ausdruck zum Einschalten nur einmal ausgewertet wird), es sei denn, es gibt eine Break-Anweisung. Zum Beispiel,

for case in [expression]:
    if case == 1:
        print(end='Was 1. ')

    if case == 2:
        print(end='Was 2. ')
        break

    if case in (1, 2):
        print(end='Was 1 or 2. ')

    print(end='Was something. ')

druckt Was 1. Was 1 or 2. Was something. (Verdammt! Warum kann ich in Inline-Codeblöcken keine Leerzeichen am Ende haben?) wenn expression wertet aus zu 1 , Was 2. wenn expression wertet aus zu 2 o Was something. wenn expression zu etwas anderem auswertet.

1 Stimmen

Nun, das Durchfallen funktioniert, aber nur, um zu do_default zu gehen.

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