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.

16voto

realmanusharma Punkte 70

Ja Python hat einen ternären Operator, hier ist die Syntax und ein Beispielcode, um das gleiche zu demonstrieren :)

#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false

a = input("Enter the First Number ")
b = input("Enter the Second Number ")

print("A is Bigger") if a>b else print("B is Bigger")

0 Stimmen

Ich habe ein einzeiliges Anweisungsbeispiel hinzugefügt, um zu prüfen, welche Zahl groß ist, um es weiter auszuarbeiten

1 Stimmen

print ist wirklich keine gute Wahl, da dies in Python2 zu einem SyntaxError führt.

0 Stimmen

@Thierry Lathuille hier habe ich die Funktion print() und nicht die Anweisung print verwendet, die Funktion print ist für Python 3 und die Anweisung print für Python 2

13voto

user118967 Punkte 3654

Andere Antworten beziehen sich korrekt auf den ternären Operator von Python. Ich möchte ergänzen, indem ich ein Szenario erwähne, für das der ternäre Operator oft verwendet wird, für das es aber ein besseres Idiom gibt. Dies ist das Szenario der Verwendung eines Standardwerts.

Angenommen, wir wollen option_value mit einem Standardwert, wenn er nicht gesetzt ist:

run_algorithm(option_value if option_value is not None else 10)

oder, falls option_value wird nie auf einen falschen Wert gesetzt ( 0 , "" , usw.), einfach

run_algorithm(option_value if option_value else 10)

In diesem Fall ist es jedoch eine noch bessere Lösung, einfach zu schreiben

run_algorithm(option_value or 10)

5 Stimmen

Eine wertvolle Ergänzung, der ich jedoch nicht zustimmen kann: option_value or 10 es pas besser als option_value if option_value is not None else 10 . Es ist zwar kürzer, sieht aber seltsam aus und kann zu Fehlern führen. Was passiert, wenn option_value = 0 zum Beispiel? Das erste Snippet wird ausgeführt run_algorithm(0) denn option_value ist nicht None . Der zweite und der dritte Ausschnitt werden jedoch ausgeführt run_algorithm(10) denn 0 ist eine Fälschung. Die beiden Ausschnitte sind nicht gleichwertig, und daher ist der eine nicht besser als der andere. Und explizit ist besser als implizit.

0 Stimmen

@ruancomelli: Guter Punkt. Ich habe die Antwort geändert, um diese Korrektur zu berücksichtigen.

4 Stimmen

Ich frage mich, ob es für Sie seltsam aussah, weil Sie die Ungenauigkeit bemerkten (dass es nicht wirklich gleichwertig war). Für mich klingt es natürlich, weil es mich an ein englisches Wort erinnert: "Nimm dies oder das (wenn die erste Option nicht verfügbar ist)". Aber das ist natürlich subjektiv. Es ist nützlich zu wissen, dass es nicht für jeden natürlich aussieht.

13voto

imerla Punkte 1401

Die Syntax für den ternären Operator in Python lautet:

[on_true] if [expression] else [on_false]

Mit dieser Syntax würden wir den obigen Code unter Verwendung des ternären Operators von Python umschreiben:

game_type = 'home'
shirt = 'white' if game_type == 'home' else 'green'

Es ist immer noch ziemlich klar, aber viel kürzer. Beachten Sie, dass der Ausdruck jede Art von Ausdruck sein kann, einschließlich eines Funktionsaufrufs, der einen Wert zurückgibt, der als Wahr oder Falsch ausgewertet wird.

11voto

Todd Punkte 3824

Python hat eine ternäre Form für Zuweisungen; es kann jedoch auch eine kürzere Form geben, die man kennen sollte.

Es kommt sehr häufig vor, dass man einer Variablen abhängig von einer Bedingung einen bestimmten Wert zuweisen muss.

>>> li1 = None
>>> li2 = [1, 2, 3]
>>>
>>> if li1:
...     a = li1
... else:
...     a = li2
...
>>> a
[1, 2, 3]

^ Dies ist die Langform für die Bearbeitung solcher Aufgaben.

Im Folgenden wird die ternäre Form dargestellt. Aber das ist nicht die prägnanteste Form - siehe das letzte Beispiel.

>>> a = li1 if li1 else li2
>>>
>>> a
[1, 2, 3]
>>>

Mit Python können Sie einfach Folgendes verwenden or für alternative Zuweisungen.

>>> a = li1 or li2
>>>
>>> a
[1, 2, 3]
>>>

Die obigen Ausführungen funktionieren, da li1 est None und der Interpreter behandelt dies als Falsch in logischen Ausdrücken. Der Interpreter geht dann weiter und wertet den zweiten Ausdruck aus, der nicht None und es ist keine leere Liste - also wird sie zugewiesen a .

Dies funktioniert auch mit leeren Listen. Wenn Sie zum Beispiel Folgendes zuweisen möchten a welche Liste auch immer Elemente enthält.

>>> li1 = []
>>> li2 = [1, 2, 3]
>>>
>>> a = li1 or li2
>>>
>>> a
[1, 2, 3]
>>>

Wenn Sie das wissen, können Sie solche Aufgaben einfach erledigen, wenn sie Ihnen begegnen. Das funktioniert auch mit Strings und anderen Iterablen. Sie können zuweisen a welche Zeichenfolge auch immer nicht leer ist.

>>> s1 = ''
>>> s2 = 'hello world'
>>>
>>> a = s1 or s2
>>>
>>> a
'hello world'
>>>

Ich mochte schon immer die ternäre Syntax von C, aber Python geht noch einen Schritt weiter!

Ich verstehe, dass einige sagen, dass dies keine gute stilistische Wahl ist, weil es sich auf Mechanismen stützt, die nicht für alle Entwickler sofort ersichtlich sind. Ich persönlich bin mit diesem Standpunkt nicht einverstanden. Python ist eine Syntax-reiche Sprache mit vielen idiomatischen Tricks, die für den Anfänger nicht sofort ersichtlich sind. Aber je mehr man lernt und die Mechanik des zugrunde liegenden Systems versteht, desto mehr weiß man es zu schätzen.

0 Stimmen

Es scheint etwas zu fehlen bei "einfach solche Aufträge" .

0 Stimmen

"Vereinfachen" Sie solche Zuweisungen =) @PeterMortensen

0 Stimmen

Sehr interessant! Zwei Fragen: 1) Wenn genau eine der beiden li1 y li2 wahrheitsgemäß ist, dann li1 or li2 seinen Wert zurück. Wenn bool(li1) gibt denselben Wert zurück wie bool(li2) wird li1 or li2 durchgängig entweder das eine oder das andere zu sein (je nach Position)? 2) Wie können Sie interpretieren, was aus li1 and li2 ? Ich kann mir mit meinen Testfällen keinen Reim darauf machen.

7voto

Franz Kurt Punkte 611

Pythonische Art, die Dinge zu tun:

"true" if var else "false"

Es gibt aber auch immer eine andere Möglichkeit, eine ternäre Bedingung zu erfüllen:

"true" and var or "false"

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