veröffentlicht am: 16.04.2020 zuletzt aktualisiert am: 02.02.2023
Manchmal muss anhand des Wertes eines Objektes eine andere Aktion durchgeführt werden, wofür es in anderen Programmiersprachen wie z.B. C++ das switch Statement gibt. Hier zeige ich dir verschiedene Wege, wie du dieses Verhalten in Python simulieren kannst.
Im folgenden Beispiel siehst du einen switch-case-Block in C++, welcher Anhand einer Ziffer von 1-3 den Namen dieser ausgibt und wenn der Wert außerhalb liegt, den Text „Zahl muss zwischen 0 und 3 sein!“ ausgibt.
switch-case in C++
switch (n) { case 1: std::cout << "Eins"; break; case 2: std::cout << "Zwei"; break; case 3: std::cout << "Drei"; break; default: std::cout << "Zahl muss zwischen 0 und 3 sein!"; }
Da es in Python kein switch Statement gibt, müssen wir uns anderer Strategien bedienen. Eine davon ist ein Dictionary zu verwenden, wie hier gezeigt.Vereinfachte Switch-Case Funktionalität mit Dictionary:
switch_mit_dictionary = { 0: 'Null', 1: 'Eins', 2: 'Zwei', 3: 'Drei' } zahl = int(input("Geben Sie eine Zahl ein: ")) print(switch_mit_dictionary.get(zahl, 'Zahl muss zwischen 0 und 3 sein!'))
Output mit 21 und 2:
> Geben Sie eine Zahl ein: 21 > Zahl muss zwischen 0 und 3 sein! > Geben Sie eine Zahl ein: 2 > Zwei
Auch mit den Schlagwörtern if, elif und else können wir dasselbe Ergebnis erzielen.
def switch_mit_if(zahl): if zahl == 0: return 'Null' elif zahl == 1: return 'Eins' elif zahl == 2: return 'Zwei' elif zahl == 3: return 'Drei' else: return 'Zahl muss zwischen 0 und 3 sein!' zahl = int(input("Geben Sie eine Zahl ein: ")) print(switch_mit_if(zahl))
Das Verhalten von Switch-Case kann mit einer eigenen Klasse noch präziser abgebildet werden. In diesem Beispiel ist eine Klasse beschrieben, die mehrere Kombinationen verwaltet.Diese Kombinationen bestehen aus dem möglichem Wert, der Callback-Funktion und einem optionalen Parameter, der angibt ob nach diesem Callback weitere Callbacks durchlaufen werden sollen.
class Switch(object): def __init__(self): # Alle möglichen Fälle werden hier festgehalten self.cases = [] # speichert, ob ein Fall eingetreten ist self.case_matched = False def add_case(self, value, callback, breaks=True): # Fügt Fall an das Ende der internen Liste self.cases self.cases.append({ "value": value, "callback": callback, "breaks": breaks }) def case(self, value): # Speichert die Zwischenergebnisse results = [] for case in self.cases: # überprüft ob bereits ein voriger Fall eingetroffen ist # oder der aktuelle Fall eintrifft if self.case_matched == True or value == case["value"]: self.case_matched = True # Ergebnis des Callbacks für den aktuellen Fall wird # gespeichert results.append(case["callback"]()) # falls breaks für den aktuellen Fall auf True # gesetzt wurde, endet die Schleife if case["breaks"]: break self.case_matched = False return results switch = Switch() case_1 = lambda : "Eins" case_2 = lambda : "Zwei" case_3 = lambda : "Drei" switch.add_case(1, case_1, False) switch.add_case(2, case_2, False) switch.add_case(3, case_3, False) print(switch.case(1)) print(switch.case(2)) print(switch.case(3))
> ['Eins', 'Zwei', 'Drei'] > ['Zwei', 'Drei'] > ['Drei']
Der vorherige Block hat alle Anweisungen durchgeführt. Ab dem frühesten Fall, der eingetroffen ist, wenn du nun stattdessen möchtest, dass keine weiteren Anweisungen ausgeführt werden, kannst du als dritten Parameter statt False True setzen.
switch = Switch() switch.add_case(1, case_1, False) switch.add_case(2, case_2, True) switch.add_case(3, case_3, False) print(switch.case(1)) print(switch.case(2)) print(switch.case(3))
> ['Eins', 'Zwei'] > ['Zwei'] > ['Drei']
Python reserviert zwar weder switch noch case als Schlüsselwort. Falls du es aber brauchst, kannst du das übliche Verhalten dieses Konstruktes einfach nachbilden.
Hast du noch Fragen oder Anregungen dazu? Hat dir dieser Beitrag gefallen?Erzähl es in den Kommentaren.
😩 Gelangweilt von den Udemy & YouTube-Tutorials?!
Lerne spielerisch Python und komme deiner gutbezahlten (und an der 🌴 liegenden) Traumkarriere einen Schritt weiter.
"Für Leute die gerne Python oder Java lernen wollen ist Codegree klasse. Ist nicht wie bei anderen Konkurrenten auf Videokursen aufgebaut..."
- Lennart Sparbier
100% kostenlos registrieren · keine Kreditkarte notwendig
Im Gegensatz zu der Abendschule oder der alteingesessenen Uni lernst du bei codegree die Sprachen & Pakete, die wirklich im Jobmarkt gesucht werden.
100% kostenlos registrieren · keine Zahlungsdaten notwendig