not - ternary operator in python example




Hat Python einen ternären bedingten Operator? (16)

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.

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


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.


Absolut und es ist unglaublich leicht zu verstehen.

general syntax : first_expression if bool_expression_is_true else second_expression

Example: x= 3 if 3 > 2 else 4 
# assigns 3 to x if the boolean expression evaluates to true or 4 if it is false

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.


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.


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 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:"?


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

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:


Ja.

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

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

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

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)

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

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

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




python-2.5