Der Walrus-Operator (:=), oder der Zuweisungsoperator für Ausdrücke, wurde in Python 3.8 eingeführt. Er wurde eingeführt, um es zu ermöglichen, eine Variable direkt in Ausdrücken (z.B. in den Bedingungen von Schleifen oder if-Anweisungen) zuzuweisen, d.h. das Ergebnis einer Funktion oder Berechnung sofort zu erhalten und zu verwenden, ohne den Aufruf zweimal wiederholen zu müssen.
Das Problem, das der Walrus-Operator löst, ist die Notwendigkeit, Berechnungen zu duplizieren oder zusätzliche Codezeilen nur für die Zuweisung zu schreiben: Vor seiner Einführung musste man einen separaten Aufruf machen und dann das Ergebnis verwenden.
Die Lösung: Jetzt kann der Ausdruck sofort innerhalb der Bedingung einer Variable zugewiesen werden, was den Code prägnanter und manchmal lesbarer macht. Es ist wichtig zu beachten, dass übermäßiger Einsatz des Walrus-Operators das Verständnis des Codes erschweren kann, insbesondere für weniger erfahrene Kollegen.
Beispielcode:
while (line := input('Geben Sie eine Zeile ein: ')) != 'exit': print(f'Sie haben eingegeben: {line}')
Wichtige Merkmale:
Kann der Walrus-Operator zur Zuweisung eines Wertes zu einer globalen Variable verwendet werden?
Ja, kann er, allerdings funktioniert der Walrus-Operator im Gültigkeitsbereich, in dem er angewendet wurde. Man muss sich des LEGB-Prinzips bewusst sein und Variablen außerhalb von Funktionen vorsichtig verwenden.
Was ist der Unterschied zwischen x = expr und (x := expr)?
x = expr ist eine eigenständige Zuweisungsanweisung, während (x := expr) ein Ausdruck ist, der das Ergebnis von expr zurückgibt und es x innerhalb eines anderen Ausdrucks zuweist. In vielen Fällen kann das zweite in if-Bedingungen, in der while-Schleife oder in Listenausdrücken verwendet werden.
Kann der Walrus-Operator innerhalb von Listenverständnissen und Generatoren verwendet werden?
Ja, der Walrus-Operator wird häufig in Comprehensions verwendet, was besonders praktisch ist, um wiederholte Berechnungen zu vermeiden.
numbers = [int(s) for s in ['1', '2', '3', '4'] if (n := int(s)) > 2] # Hier speichert n das Ergebnis von int(s), wir sparen Berechnungen
Ein Entwickler schreibt einen langen und verwirrenden if-Befehl mit mehreren geschachtelten Walrus-Operatoren:
if (a := get_a()) and (b := a.get_b()) and (c := b.do_c()): print(c)
Vorteile:
Nachteile:
Bewusster Einsatz zur Einsparung von Berechnungen und zur Lesbarkeit:
while (line := sys.stdin.readline()) != '': process(line)
Vorteile:
Nachteile: