Wenn Python keinen ternären Bedingungsoperator hat, ist es dann möglich, einen solchen mit anderen Sprachkonstrukten zu simulieren?
Ja, sie wurde in Version 2.5 hinzugefügt. Die Syntax des Ausdrucks lautet:
a if condition else b
Zuerst wird condition
ausgewertet, dann wird genau eines von a
oder b
ausgewertet und zurückgegeben, basierend auf dem booleschen Wert von condition
. Wenn condition
zu True
ausgewertet wird, wird a
ausgewertet und zurückgegeben, aber b
wird ignoriert, oder wenn b
ausgewertet und zurückgegeben wird, aber a
ignoriert wird.
Dies ermöglicht einen Kurzschluss, denn wenn condition
wahr ist, wird nur a
ausgewertet und b
wird überhaupt nicht ausgewertet, aber wenn condition
falsch ist, wird nur b
ausgewertet und a
wird überhaupt nicht ausgewertet.
Zum Beispiel:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Beachten Sie, dass Konditionale ein Ausdruck sind, keine Anweisung. Das bedeutet, dass Sie keine Zuweisungsanweisungen oder "pass" oder andere Anweisungen innerhalb eines bedingten Ausdrucks verwenden können:
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
Sie können jedoch bedingte Ausdrücke verwenden, um eine Variable wie folgt zuzuweisen:
x = a if True else b
Stellen Sie sich den bedingten Ausdruck als Umschaltung zwischen zwei Werten vor. Er ist sehr nützlich, wenn Sie sich in einer 'ein Wert oder ein anderer' Situation befinden, aber sonst tut er nicht viel.
Wenn Sie Anweisungen verwenden müssen, müssen Sie eine normale "wenn"-Anweisung anstelle eines bedingten Ausdrucks verwenden.
Beachten Sie, dass dies bei einigen Pythonisten aus verschiedenen Gründen verpönt ist:
if
' wirklich nützlich sein kann und Ihr Skript prägnanter macht, macht es Ihren Code wirklich komplizierter)Wenn Sie Schwierigkeiten haben, sich die Reihenfolge zu merken, dann denken Sie daran, dass Sie beim Vorlesen (fast) sagen, was Sie meinen. Zum Beispiel wird x = 4 if b > 8 else 9
laut als x wird 4 sein, wenn b größer als 8 ist, sonst 9
vorgelesen.
Offizielle Dokumentation:
Für Versionen vor 2.5 gibt es einen Trick:
[expression] and [on_true] or [on_false]
Es kann falsche Ergebnisse liefern, wenn on_true
einen falschen booleschen Wert hat.1
Allerdings hat es den Vorteil, dass Ausdrücke von links nach rechts ausgewertet werden, was meiner Meinung nach übersichtlicher ist.
1. Gibt es ein Äquivalent zu dem ternären Operator "?:" von C?
Aus [der Dokumentation]:
Bedingte Ausdrücke (manchmal als "ternärer Operator" bezeichnet) haben die niedrigste Priorität aller Python-Operationen.
Der Ausdruck
x if C else y
wertet zuerst die Bedingung C (not x) aus; wenn C wahr ist, wird x ausgewertet und sein Wert zurückgegeben; andernfalls wird y ausgewertet und sein Wert zurückgegeben.Siehe PEP 308 für weitere Details über bedingte Ausdrücke.
Neu seit Version 2.5.