7948 Stimmen

Verfügt Python über einen ternären bedingten Operator?

Wenn Python keine ternärer Konditionaloperator Ist es möglich, andere Sprachkonstrukte zu verwenden, um eine solche zu simulieren?

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.

9153voto

Vinko Vrsalovic Punkte 252104

Ja, es war hinzugefügt. in Version 2.5. Die Syntax des Ausdrucks lautet:

a if condition else b

Erste condition ausgewertet wird, dann wird genau eine der beiden a ou b wird ausgewertet und auf der Grundlage der Boolean Wert von condition . Wenn condition wertet aus zu True dann a wird ausgewertet und zurückgegeben, aber b ignoriert wird, oder aber wenn b wird ausgewertet und zurückgegeben, aber a wird ignoriert.

Dies ermöglicht einen Kurzschluss, denn wenn condition ist nur wahr a wird ausgewertet und b wird überhaupt nicht ausgewertet, aber wenn condition ist nur falsch b ausgewertet wird, 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 , nicht ein Anweisung . Das heißt, Sie können keine Zuweisungsanweisungen oder pass oder andere Aussagen innerhalb einer bedingten Ausdruck :

>>> 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 er tut nicht viel anderes.

Wenn Sie Anweisungen verwenden müssen, müssen Sie eine normale if Anweisung anstelle einer bedingten Ausdruck .


Beachten Sie, dass dies bei einigen Pythonisten aus verschiedenen Gründen verpönt ist:

  • Die Reihenfolge der Argumente unterscheidet sich von denen der klassischen condition ? a : b ternären Operator aus vielen anderen Sprachen (z. B. C , C++ , Weiter , Perl , Rubinrot , Java , JavaScript usw.), was zu Fehlern führen kann, wenn Leute, die mit dem "überraschenden" Verhalten von Python nicht vertraut sind, es benutzen (sie könnten die Reihenfolge der Argumente umkehren).
  • Manche finden es "sperrig", da es dem normalen Gedankengang (zuerst an die Krankheit und dann an die Auswirkungen denken) zuwiderläuft.
  • Stilistische Gründe. (Obwohl die "Inline if ' kann sein wirklich nützlich sind und Ihr Skript übersichtlicher machen, verkomplizieren sie Ihren Code wirklich)

Wenn Sie sich die Reihenfolge nicht merken können, denken Sie daran, dass Sie beim lauten Lesen (fast) sagen, was Sie meinen. Zum Beispiel, x = 4 if b > 8 else 9 wird laut vorgelesen als x will be 4 if b is greater than 8 otherwise 9 .

Offizielle Dokumentation:

360 Stimmen

Die Reihenfolge mag für Programmierer jedoch seltsam erscheinen f(x) = |x| = x if x > 0 else -x klingt für Mathematiker sehr natürlich. Man kann es auch so verstehen, dass man in den meisten Fällen A tut, außer wenn C, dann sollte man stattdessen B tun...

174 Stimmen

Achten Sie auf die Reihenfolge der Operationen, wenn Sie dies verwenden. Zum Beispiel kann die Zeile z = 3 + x if x < y else y . Si x=2 y y=1 könnte man erwarten, dass dies 4 ergibt, aber es würde tatsächlich 1 ergeben. z = 3 + (x if x > y else y) ist die korrekte Verwendung.

20 Stimmen

Der Punkt war, wenn Sie zusätzliche Bewertungen durchführen wollen nach die Bedingung ausgewertet wird, wie das Hinzufügen eines Wertes zum Ergebnis, müssen Sie entweder den zusätzlichen Ausdruck zu beiden Seiten hinzufügen ( z = 3 + x if x < y else 3 + y ), oder gruppieren Sie die Bedingung ( z = 3 + (x if x < y else y) o z = (x if x < y else y) + 3 )

1003voto

Landon Kuhn Punkte 65193

Sie können ein Tupel indizieren:

(falseValue, trueValue)[test]

test muss zurückkehren Wahr ou Falsch .
Es könnte sicherer sein, es immer als zu implementieren:

(falseValue, trueValue)[test == True]

oder Sie können die integrierte bool() zur Gewährleistung einer Boolesche Wert:

(falseValue, trueValue)[bool(<expression>)]

728 Stimmen

Beachten Sie, dass hier immer alles ausgewertet wird, während das if/else-Konstrukt nur den gewinnenden Ausdruck auswertet.

145 Stimmen

(lambda: print("a"), lambda: print("b"))[test==true]()

20 Stimmen

Es sollte beachtet werden, dass das, was im [] s kann ein beliebiger Ausdruck sein. Zur Sicherheit können Sie auch explizit auf Wahrhaftigkeit testen, indem Sie schreiben [bool(<expression>)] . Die bool() Funktion gibt es seit Version 2.2.1.

438voto

James Brady Punkte 22686

Für Versionen vor 2.5 gibt es einen Trick:

[expression] and [on_true] or [on_false]

Es kann zu falschen Ergebnissen führen, wenn on_true hat einen falschen booleschen Wert. 1

Allerdings hat es den Vorteil, dass Ausdrücke von links nach rechts ausgewertet werden, was meiner Meinung nach übersichtlicher ist.

1. <a href="http://docs.python.org/3.3/faq/programming.html#is-there-an-equivalent-of-c-s-ternary-operator" rel="noreferrer">Gibt es eine Entsprechung des ternären Operators "?:" in C?</a>

77 Stimmen

Abhilfe schafft die Verwendung von (test und [true_value] oder [false_value])[0], wodurch diese Falle vermieden wird.

8 Stimmen

Der ternäre Operator wird in der Regel schneller ausgeführt (manchmal um 10-25 %).

10 Stimmen

@volcano Haben Sie eine Quelle für mich?

362voto

Simon Zimmermann Punkte 3726

_<expression 1>_ **if** _<condition>_ **else** _<expression 2>_

a = 1
b = 2

1 if a > b else -1 
# Output is -1

1 if a > b else -1 if a < b else 0
# Output is -1

97 Stimmen

Dieses Beispiel unterstreicht die primäre Absicht des ternären Operators: die Auswahl von Werten. Er zeigt auch, dass mehrere ternäre Operatoren zu einem einzigen Ausdruck verkettet werden können.

7 Stimmen

@Craig , ich stimme zu, aber es ist auch hilfreich zu wissen, was passiert, wenn keine Klammern vorhanden sind. In echtem Code würde auch ich dazu neigen, explizite Klammern einzufügen.

1 Stimmen

Verwendung: return 3 if t > 10 else t/2

208voto

Michael Burr Punkte 320591

Von die Dokumentation :

Bedingte Ausdrücke (manchmal auch "ternäre Operatoren" genannt) haben die niedrigste Priorität aller Python-Operationen.

Der Ausdruck x if C else y wertet zunächst die Bedingung aus, C ( nicht x ); wenn C wahr ist, x ausgewertet und sein Wert zurückgegeben wird; andernfalls, y wird ausgewertet und sein Wert zurückgegeben.

Siehe PEP 308 für weitere Details über bedingte Ausdrücke.

Neu seit Version 2.5.

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