Verfügt Python über einen ternären bedingten Operator?
Ja. Von der Grammatikdatei :
test: or_test ['if' or_test 'else' test] | lambdef
Dieser Teil ist von Interesse:
or_test ['if' or_test 'else' test]
Eine ternäre bedingte Operation hat also die Form:
expression1 if expression2 else expression3
expression3
faul ausgewertet (d. h. nur ausgewertet, wenn expression2
in einem booleschen Kontext falsch ist). Und aufgrund der rekursiven Definition können Sie sie unbegrenzt verketten (obwohl dies als schlechter Stil angesehen werden kann).
expression1 if expression2 else expression3 if expression4 else expression5 # and so on
Ein Hinweis zur Verwendung:
Beachten Sie, dass jeder if
muss mit einer else
. Für Personen, die Listenverstehenssätze und Generatorausdrücke lernen, kann dies eine schwierige Lektion sein - das Folgende wird nicht funktionieren, da Python einen dritten Ausdruck für ein else erwartet:
[expression1 if expression2 for element in iterable]
# ^-- need an else here
die eine SyntaxError: invalid syntax
. Das obige Beispiel ist also entweder ein unvollständiges Stück Logik (vielleicht erwartet der Benutzer ein no-op in der falschen Bedingung) oder es ist beabsichtigt, die expression2
als Filter - stellt fest, dass das Folgende legales Python ist:
[expression1 for element in iterable if expression2]
expression2
funktioniert als Filter für das Listenverständnis und ist pas ein ternärer bedingter Operator.
Alternative Syntax für einen engeren Fall:
Sie werden es vielleicht etwas schmerzhaft finden, das Folgende zu schreiben:
expression1 if expression1 else expression2
expression1
muss bei der obigen Verwendung zweimal ausgewertet werden. Es kann die Redundanz begrenzen, wenn es einfach eine lokale Variable ist. Ein gängiges und leistungsfähiges Pythonic Idiom für diesen Anwendungsfall ist jedoch die Verwendung von or
Verhalten der Abkürzungen:
expression1 or expression2
was semantisch gleichwertig ist. Beachten Sie, dass einige Styleguides diese Verwendung aus Gründen der Klarheit einschränken können - sie verpackt eine Menge Bedeutung in sehr wenig Syntax.
4 Stimmen
Obwohl Pythons, die älter als 2.5 sind, langsam der Vergangenheit angehören, gibt es hier eine Liste alter ternärer Operator-Tricks aus der Zeit vor 2.5: "Python Idioms", Suche nach dem Text 'Conditional expression' (Bedingter Ausdruck) . Wikipedia ist auch sehr hilfreich :-)
212 Stimmen
In der offiziellen Dokumentation zu Python 3.0, auf die in einem Kommentar oben verwiesen wird, wird dies als "conditional_expressions" bezeichnet und ist sehr kryptisch definiert. Diese Dokumentation enthält nicht einmal den Begriff "ternär", so dass man nur schwerlich über Google danach suchen kann, wenn man nicht genau weiß, wonach man suchen muss. Die Version 2 Dokumentation ist etwas hilfreicher und enthält einen Link zu "PEP 308" die eine Menge interessanter historischer Zusammenhänge zu dieser Frage enthält.
48 Stimmen
"ternär" (mit drei Eingängen) ist eine Folgeeigenschaft dieser Aufteilung, keine definierende Eigenschaft des Konzepts. z.B.: SQL hat
case [...] { when ... then ...} [ else ... ] end
für eine ähnliche Wirkung, aber keineswegs ternär.20 Stimmen
Auch in ISO/IEC 9899 (dem Standard für die Programmiersprache C) heißt es in Abschnitt 6.5.15 "the condtitional operator".
18 Stimmen
Wikipedia behandelt dies ausführlich in dem Artikel " ?: ".
2 Stimmen
Es wird hier erwähnt docs.python.org/3/faq/ , aber nicht in der Python-Standardbibliothek erwähnt
20 Stimmen
In den Jahren seit Nobars Kommentar hat die Dokumentation der bedingten Ausdrücke wurde aktualisiert und lautet nun Bedingte Ausdrücke (manchmal auch "ternärer Operator" genannt)...
3 Stimmen
Ich frage mich manchmal, wie es möglich ist, dass auf eine Ja- oder Nein-Frage 26 Antworten kommen
4 Stimmen
Ab 2020 liegt die umfassende Antwort in der Ternäre Operatoren'. Dokumentation: " Ternäre Operatoren sind besser bekannt als bedingte Ausdrücke [...] Sie wurden in Version 2.4 in Python integriert. "
2 Stimmen
Es ist auch nützlich, die logische
or
Operator, wie zum Beispielx = a or b