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.

31voto

shivtej Punkte 323
a if condition else b

Prägen Sie sich diese Pyramide ein, wenn Sie Schwierigkeiten haben, sie sich zu merken:

     condition
  if           else
a                   b

29voto

Ali Hallaji Punkte 2186

Der ternäre Bedingungsoperator ermöglicht es einfach, eine Bedingung in einer einzigen Zeile zu testen und ersetzt damit das mehrzeilige if-else, was den Code kompakt macht.

Syntax:

[on_true] if [expression] else [on_false]

1- Einfache Methode zur Verwendung des ternären Operators:

# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10

2- Direkte Methode der Verwendung von Tupeln, Dictionary und Lambda:

# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lambda is more efficient than above two methods
# because in lambda  we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10

3- Der ternäre Operator kann als verschachteltes if-else geschrieben werden:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")

Der obige Ansatz kann wie folgt beschrieben werden:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal")
# Output: b is greater than a

1 Stimmen

Beachten Sie, dass der ternäre Operator kleiner (im Speicher) und schneller ist als das verschachtelte if. Außerdem ist Ihr verschachtelter if-else ist eigentlich keine Neuschreibung des ternären Operators und erzeugt unterschiedliche Ausgaben für ausgewählte Werte von a und b (insbesondere, wenn einer ein Typ ist, der eine seltsame __ne__ Methode).

28voto

Natesh bhat Punkte 9865

Sie können dies tun:

[condition] and [expression_1] or [expression_2];

Beispiel:

print(number%2 and "odd" or "even")

Dies würde "ungerade" ausgeben, wenn die Zahl ungerade ist, oder "gerade", wenn die Zahl gerade ist.


Das Ergebnis: Wenn die Bedingung erfüllt ist, wird exp_1 ausgeführt, andernfalls wird exp_2 ausgeführt.

Anmerkung: 0, None, False, emptylist, und emptyString wird als False ausgewertet.

Und alle Daten, die nicht 0 sind, werden als True ausgewertet.

Und so funktioniert es:

Wenn die Bedingung [condition] "True" wird, wird expression_1 ausgewertet, aber nicht expression_2.

Wenn wir etwas mit 0 (Null) "und" verbinden, wird das Ergebnis immer falsch sein. Also in der unten stehenden Aussage,

0 and exp

Der Ausdruck exp wird überhaupt nicht ausgewertet, da "und" mit 0 immer zu Null ausgewertet wird und der Ausdruck nicht ausgewertet werden muss. So arbeitet der Compiler selbst in allen Sprachen.

Unter

1 or exp

der Ausdruck exp wird überhaupt nicht ausgewertet, da "oder" mit 1 immer 1 ist. Daher wird der Ausdruck exp nicht ausgewertet, da das Ergebnis ohnehin 1 sein wird (Optimierungsmethoden des Compilers).

Aber im Falle von

True and exp1 or exp2

Der zweite Ausdruck exp2 wird nicht ausgewertet, da True and exp1 wäre True, wenn exp1 nicht false ist.

Ähnlich in

False and exp1 or exp2

Der Ausdruck exp1 wird nicht ausgewertet, da False dem Schreiben von 0 entspricht und "and" mit 0 selbst 0 wäre, aber nach exp1, da "or" verwendet wird, wird der Ausdruck exp2 nach "or" ausgewertet.


Anmerkung:- Diese Art der Verzweigung mit "oder" und "und" kann nur verwendet werden, wenn der Ausdruck_1 nicht den Wahrheitswert False (oder 0 oder None oder emptylist [ ] oder emptystring ' '.) hat, denn wenn der Ausdruck_1 False wird, dann wird der Ausdruck_2 wegen des vorhandenen "oder" zwischen exp_1 und exp_2 ausgewertet.

Falls Sie dennoch möchten, dass es für alle Fälle funktioniert, unabhängig davon, welche Wahrheitswerte exp_1 und exp_2 sind, tun Sie Folgendes:

[condition] and ([expression_1] or 1) or [expression_2];

0 Stimmen

Wenn Sie das im Kontext von x = [condition] and ([expression_1] or 1) or [expression_2] y expression_1 wird als false ausgewertet, x wird sein 1 , nicht expression_1 . Verwenden Sie die akzeptierte Antwort.

27voto

Todor Minakov Punkte 17063

Mehr ein Tipp als eine Antwort (ich muss das Offensichtliche nicht zum hundertsten Mal wiederholen), aber ich verwende es manchmal als Einzeiler in solchen Konstrukten:

if conditionX:
    print('yes')
else:
    print('nah')

wird:

print('yes') if conditionX else print('nah')

Einige (viele :) mögen es als unpythonisch (sogar Ruby-isch :) missbilligen, aber ich persönlich finde es natürlicher - d.h. so, wie man es normalerweise ausdrücken würde, und in großen Codeblöcken auch ein wenig optisch ansprechender.

8 Stimmen

Ich bevorzuge print( 'yes' if conditionX else 'nah' ) über Ihre Antwort. :-)

1 Stimmen

Das heißt, wenn Sie print() in beiden Fällen - und es sieht ein bisschen pythonischer aus, muss ich zugeben :) Was aber, wenn die Ausdrücke/Funktionen nicht dieselben sind - wie print('yes') if conditionX else True - um die print() nur in Wahrheit conditionX

0 Stimmen

Um die Bemerkung von Frederick99 zu ergänzen: ein weiterer Grund, die print('yes') if conditionX else print('nah') ist, dass es in Python2 zu einem SyntaxFehler führt.

18voto

Andy Jazz Punkte 34407

Viele Programmiersprachen, die von C haben normalerweise die folgende Syntax des ternären bedingten Operators:

<condition> ? <expression1> : <expression2>

Zunächst wurde die Python wohlwollender Diktator auf Lebenszeit (Ich meine Guido van Rossum (natürlich) abgelehnt (als nicht-pythonischer Stil), da er für Leute, die mit der Sprache C nicht vertraut sind, ziemlich schwer zu verstehen ist. Außerdem ist das Doppelpunkt-Zeichen : hat bereits viele Verwendungen in Python. Nach PEP 308 genehmigt wurde, erhielt Python endlich seine eigene Abkürzung für bedingte Ausdrücke (die wir jetzt verwenden):

<expression1> if <condition> else <expression2>

Zunächst wird also die Bedingung bewertet. Wenn sie zurückkommt True , Ausdruck1 wird ausgewertet und ergibt das Ergebnis, andernfalls Ausdruck2 bewertet werden. Aufgrund von faule Bewertung Mechanik - es wird nur ein Ausdruck ausgeführt.

Hier sind einige Beispiele (die Bedingungen werden von links nach rechts ausgewertet):

pressure = 10
print('High' if pressure < 20 else 'Critical')

# Result is 'High'

Ternäre Operatoren können in Reihe geschaltet werden:

pressure = 5
print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical')

# Result is 'Normal'

Die folgende ist die gleiche wie die vorherige:

pressure = 5

if pressure < 20:
    if pressure < 10:
        print('Normal')
    else:
        print('High')
else:
    print('Critical')

# Result is 'Normal'

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