operators ternary - Hat Python einen ternären bedingten Operator?




example inline (20)

Wenn Python keinen ternären bedingten Operator hat, ist es möglich, einen Operator mit anderen Sprachkonstrukten zu simulieren?


Answers

Sie können in ein Tupel indexieren:

(falseValue, trueValue)[test]

test muss True oder False zurückgeben .
Es ist möglicherweise sicherer, es immer als zu implementieren:

(falseValue, trueValue)[test == True]

oder Sie können das eingebaute bool() , um einen Boolean Wert sicherzustellen:

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


Aus der Dokumentation :

Bedingte Ausdrücke (manchmal auch 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 ( nicht x ) aus; Wenn C wahr ist, wird x ausgewertet und sein Wert zurückgegeben. Andernfalls wird y ausgewertet und der Wert zurückgegeben.

Weitere Informationen zu bedingten Ausdrücken finden Sie in PEP 308 .

Neu seit Version 2.5.


Simulieren des ternären Python-Operators.

Zum Beispiel

a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()

Ausgabe:

'b greater than a'

du kannst das :-

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

Beispiel:-

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

Dies würde "ungerade" drucken, wenn die Anzahl gerade oder ungerade ist, wenn die Anzahl gerade ist.

Das Ergebnis: - Wenn Bedingung wahr ist, wird exp_1 ausgeführt, andernfalls wird exp_2 ausgeführt.

Hinweis: - 0, Keine, False, Leere Liste, LeereString wird als False ausgewertet. Alle Daten außer 0 werden als True ausgewertet.

So funktioniert das:

Wenn die Bedingung [Bedingung] "True" wird, wird Ausdruck_1 ausgewertet, nicht Ausdruck_2. Wenn wir "und" etwas mit 0 (Null) haben, wird das Ergebnis immer schnell sein. So in der folgenden Anweisung:

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 funktioniert der Compiler in allen Sprachen.

Im

1 or exp

Der Ausdruck exp wird überhaupt nicht ausgewertet, da "oder" mit 1 immer 1 sein wird. Daher wird es nicht stören, den Ausdruck exp zu bewerten, da das Ergebnis ohnehin 1 ist. (Methoden zur Compiler-Optimierung).

Aber im Falle von

True and exp1 or exp2

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

Ähnlich in

False and exp1 or exp2

Der Ausdruck exp1 wird nicht ausgewertet, da False gleichbedeutend mit dem Schreiben von 0 ist und "und" mit 0 wäre 0, aber nach exp1, da "oder" verwendet wird, wird der Ausdruck exp2 nach "oder" ausgewertet.

Hinweis: - Diese Art der Verzweigung mit "oder" und "und" kann nur verwendet werden, wenn der Ausdruck_1 keinen Wahrheitswert von False (oder 0 oder None oder Emptylist [] oder Emptystring ''.) Hat, da Ausdruck_1 zu wird False, dann wird der Ausdruck_2 aufgrund des Vorhandenseins "oder" zwischen exp_1 und exp_2 ausgewertet.

Falls Sie dennoch für alle Fälle funktionieren möchten, unabhängig von den Wahrheitswerten von exp_1 und exp_2, führen Sie folgende Schritte aus: -

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


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")

Sie könnten oft finden

cond and on_true or on_false

Dies führt jedoch zu Problemen, wenn on_true == 0 ist

>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1

wo Sie für einen normalen ternären Operator dieses Ergebnis erwarten würden

>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1

@oben:

Leider die

(falseValue, trueValue)[test]

Lösung hat kein Kurzschlussverhalten; Daher werden sowohl falseValue als auch trueValue unabhängig von der Bedingung ausgewertet. Dies kann suboptimal oder sogar fehlerhaft sein (dh sowohl trueValue als auch falseValue können Methoden sein und Nebenwirkungen haben).

Eine Lösung dafür wäre

(lambda: falseValue, lambda: trueValue)[test]()

(Ausführung verzögert, bis der Gewinner bekannt ist;)), führt jedoch zu Inkonsistenz zwischen aufrufbaren und nicht aufrufbaren Objekten. Außerdem löst es den Fall nicht, wenn Eigenschaften verwendet werden.

Und so ist die Geschichte - die Wahl zwischen drei genannten Lösungen ist ein Kompromiss zwischen der Kurzschlussfunktion, der Verwendung von mindestens Python 2.5 (IMHO ist kein Problem mehr) und der Neigung zu "trueValue-evaluates-to-false". Fehler.


Eher ein Tipp als eine Antwort (das offensichtliche für das Hundertste Mal muss nicht wiederholt werden), aber manchmal verwende ich es als Oneliner-Shortcut 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 missbilligen (sogar Ruby-ish :), aber ich persönlich finde es natürlicher - dh wie man es normalerweise ausdrückt, plus ein bisschen visueller in großen Codeblocks.


Wenn eine Variable definiert ist und Sie prüfen möchten, ob sie einen Wert hat, können Sie nur a or b

def test(myvar=None):
    # shorter than: print myvar if myvar else "no Input"
    print myvar or "no Input"

test()
test([])
test(False)
test('hello')
test(['Hello'])
test(True)

wird ausgegeben

no Input
no Input
no Input
hello
['Hello']
True

Ja, es wurde in Version 2.5 added .
Die Syntax lautet:

a if condition else b

Die erste condition wird ausgewertet, dann wird entweder a oder b basierend auf dem Boolean Wert von condition
Wenn die condition True ergibt, wird a zurückgegeben, andernfalls wird b zurückgegeben.

Zum Beispiel:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

Beachten Sie, dass Bedingungswerte ein Ausdruck und keine Anweisung sind . Das bedeutet, dass Sie keine Zuweisungen oder pass oder andere Anweisungen in einer Bedingung verwenden können:

>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

In einem solchen Fall müssen Sie anstelle einer Bedingung eine normale if Anweisung verwenden.

Denken Sie daran, dass einige Pythonistas aus mehreren Gründen die Stirn verpönten:

  • Die Reihenfolge der Argumente unterscheidet sich von vielen anderen Sprachen (wie z. B. C, Ruby, Java usw.). Dies kann zu Fehlern führen, wenn Personen, die mit Pythons "überraschendem" Verhalten nicht vertraut sind, sie verwenden (sie können die Reihenfolge umkehren).
  • Einige finden es "unhandlich", da es dem normalen Gedankenfluss zuwiderläuft (zuerst an den Zustand denken und dann an die Auswirkungen).
  • Stilistische Gründe.

Wenn Sie Schwierigkeiten haben, sich an die Reihenfolge zu erinnern, denken Sie daran, dass Sie (fast) sagen, was Sie meinen, wenn Sie sie laut vorlesen. Beispielsweise ist x = 4 if b > 8 else 9 vorgelesen, da x will be 4 if b is greater than 8 otherwise 9 .

Offizielle Dokumentation:


Ternärer Operator in verschiedenen Programmiersprachen

Ich versuche hier nur einige wichtige Unterschiede zwischen den Programmiersprachen im ternary operator .

Ternärer Operator in Javascript

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

Ternärer Operator in Ruby

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

Ternärer Betreiber in Scala

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

Ternärer Operator in der R-Programmierung

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

Ternärer Operator in Python

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0

Jetzt können Sie die Schönheit der Pythonsprache sehen. Es ist sehr gut lesbar und wartbar.


Für Python 2.5 und neuere Versionen gibt es eine bestimmte Syntax:

[on_true] if [cond] else [on_false]

In älteren Pythons ist ein ternärer Operator nicht implementiert, er kann jedoch simuliert werden.

cond and on_true or on_false

Es gibt jedoch ein potenzielles Problem: Wenn cond auf True und on_true auf False ausgewertet wird, wird on_false anstelle von on_true . Wenn Sie dieses Verhalten wünschen, ist die Methode in Ordnung, andernfalls verwenden Sie Folgendes:

{True: on_true, False: on_false}[cond is True] # is True, not == True

was kann verpackt werden von:

def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]

und auf diese Weise benutzt:

q(cond, on_true, on_false)

Es ist mit allen Python-Versionen kompatibel.


Ja.

>>> b = (True if 5 > 4 else False)
>>> print b
True

Syntax: Der ternäre Operator wird wie folgt angegeben:

[on_true] if [expression] else [on_false]

z.B

x, y = 25, 50
big = x if x < y else y
print(big)

Ja:

Angenommen, Sie möchten der Variablen x einen Wert geben, wenn ein bool wahr ist und ebenfalls

X = 5, wenn etwas anderes x = 10 ist

X = [irgendein Wert] wenn [wenn dies wahr ist erster Wert wertet] else [anderer Wert wertet]


Für Versionen vor 2.5 gibt es den Trick:

[expression] and [on_true] or [on_false]

Es kann falsche Ergebnisse on_true wenn on_true einen falschen booleschen Wert hat. 1
Es hat zwar den Vorteil, die Ausdrücke von links nach rechts zu bewerten, was meiner Meinung nach klarer ist.

1. Gibt es ein Äquivalent zu dem ternären Operator "C:"?


Hat Python einen ternären bedingten Operator?

Ja. Aus der Grammatikdatei :

test: or_test ['if' or_test 'else' test] | lambdef

Der Teil von Interesse ist:

or_test ['if' or_test 'else' test]

Eine ternäre bedingte Operation hat also die Form:

expression1 if expression2 else expression3

expression3 wird träge 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 wird.)

expression1 if expression2 else expression3 if expression4 else expression5 # and so on

Ein Hinweis zur Nutzung:

Beachten Sie, dass auf jedes if ein else folgen muss. Personen, die Listenverstehen und Generatorausdrücke lernen, finden dies möglicherweise als schwierig zu lernen - das Folgende wird nicht funktionieren, da Python einen dritten Ausdruck für einen anderen erwartet:

[expression1 if expression2 for element in iterable]
#                          ^-- need an else here

was einen SyntaxError: invalid syntax . Das Obige ist also entweder ein unvollständiger Teil der Logik (vielleicht erwartet der Benutzer ein No-Op in der falschen Bedingung) oder es ist beabsichtigt, expression2 als Filter zu verwenden - stellt fest, dass Folgendes Python legal ist:

[expression1 for element in iterable if expression2]

expression2 als Filter für das Listenverständnis und ist kein ternärer bedingter Operator.

Alternative Syntax für einen engeren Fall:

Es kann etwas schmerzhaft sein, folgendes zu schreiben:

expression1 if expression1 else expression2

expression1 muss mit der obigen Verwendung zweimal ausgewertet werden. Es kann die Redundanz einschränken, wenn es sich lediglich um eine lokale Variable handelt. Ein übliches und performantes Pythonic-Idiom für diesen Anwendungsfall ist jedoch das Abkürzungsverhalten von or :

expression1 or expression2

was in der Semantik gleichwertig ist. Beachten Sie, dass einige Style-Guides diese Verwendung aus Gründen der Klarheit einschränken können, da sie sehr viel Bedeutung in sehr wenig Syntax enthalten.


Ausdruck1 wenn Bedingung sonst Ausdruck2

>>> a = 1
>>> b = 2
>>> 1 if a > b else -1 
-1
>>> 1 if a > b else -1 if a < b else 0
-1

Es scheint, dass die !! Operator führt zu einer doppelten Negation.

var foo = "Hello World!";

!foo // Result: false
!!foo // Result: true






python operators ternary-operator conditional-operator python-2.5