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




11 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>)]
inline if numpy

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




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



Ein Operator für einen bedingten Ausdruck in Python wurde 2006 als Teil von Python Enhancement Proposal 308 hinzugefügt. Seine Form unterscheidet sich vom üblichen ?: Operator und es ist:

<expression1> if <condition> else <expression2>

was äquivalent ist zu:

if <condition>: <expression1> else: <expression2>

Hier ist ein Beispiel:

result = x if a > b else y

Eine andere Syntax, die verwendet werden kann (kompatibel mit Versionen vor 2.5):

result = (lambda:y, lambda:x)[a > b]()

wo Operanden träge ausgewertet werden .

Eine andere Möglichkeit ist das Indizieren eines Tupels (das nicht mit dem Bedingungsoperator der meisten anderen Sprachen übereinstimmt):

result = (y, x)[a > b]

oder explizit konstruiertes Wörterbuch:

result = {True: x, False: y}[a > b]

Eine andere (weniger zuverlässige), aber einfachere Methode ist die Verwendung von and und or Operatoren:

result = (a > b) and x or y

Dies funktioniert jedoch nicht, wenn x False .

Eine mögliche Problemumgehung besteht darin, x und y Listen oder Tupel wie folgt zu erstellen:

result = ((a > b) and [x] or [y])[0]

oder:

result = ((a > b) and (x,) or (y,))[0]

Wenn Sie mit Wörterbüchern arbeiten, können Sie, anstatt eine ternäre Bedingung zu verwenden, die Funktion get(key, default) . Beispiel:

shell = os.environ.get('SHELL', "/bin/sh")

Quelle: ?:




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.




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



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.




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] ;




In [1]: a = 1 if False else 0

In [2]: a
Out[2]: 0

In [3]: b = 1 if True else 0

In [4]: b
Out[4]: 1



Ja, du kannst es so benutzen:

is_fat = True
state = "fat" if is_fat else "not fat"

Lesen Sie mehr über den ternären bedingten Operator




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



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



Related