Wenn Python keinen ternären bedingten Operator hat, ist es möglich, einen mit anderen Sprachkonstrukten zu simulieren?
case [...] { when ... then ...} [ else ... ] end
einen ähnlichen Effekt, ist aber überhaupt nicht ternär.
Wenn Python keinen ternären bedingten Operator hat, ist es möglich, einen mit anderen Sprachkonstrukten zu simulieren?
case [...] { when ... then ...} [ else ... ] end
einen ähnlichen Effekt, ist aber überhaupt nicht ternär.
Antworten:
Ja, es wurde in Version 2.5 hinzugefügt . Die Ausdruckssyntax lautet:
a if condition else b
Zuerst condition
wird ausgewertet, dann genau einer von beiden a
oder b
wird ausgewertet und basierend auf dem Booleschen Wert von zurückgegeben condition
. Wenn condition
ausgewertet wird True
, a
wird ausgewertet und zurückgegeben, aber b
ignoriert, oder wenn b
ausgewertet und zurückgegeben, aber a
ignoriert wird.
Dies ermöglicht einen Kurzschluss, da nur wenn condition
wahr wahr a
ist, ausgewertet wird und überhaupt b
nicht ausgewertet wird, wenn condition
jedoch falsch ist, nur b
ausgewertet wird und überhaupt a
nicht ausgewertet wird.
Zum Beispiel:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Beachten Sie, dass Bedingungen ein Ausdruck und keine Anweisung sind . Dies bedeutet, dass Sie keine Zuweisungsanweisungen pass
oder andere Anweisungen innerhalb eines bedingten Ausdrucks verwenden können :
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
Sie können jedoch bedingte Ausdrücke verwenden, um eine Variable wie folgt zuzuweisen:
x = a if True else b
Stellen Sie sich den bedingten Ausdruck als Umschalten zwischen zwei Werten vor. Es ist sehr nützlich, wenn Sie sich in einer Situation mit dem einen oder anderen Wert befinden, aber sonst macht es nicht viel.
Wenn Sie Anweisungen verwenden müssen, müssen Sie eine normale if
Anweisung anstelle eines bedingten Ausdrucks verwenden .
Denken Sie daran, dass es von einigen Pythonisten aus mehreren Gründen missbilligt wird:
condition ? a : b
ternären Operators aus vielen anderen Sprachen (wie C, C ++, Go, Perl, Ruby, Java, Javascript usw.), was zu Fehlern führen kann, wenn Personen mit Pythons nicht vertraut sind. " überraschendes "Verhalten verwenden es (sie können die Argumentreihenfolge umkehren).if
' sehr nützlich sein und Ihr Skript präziser gestalten kann, kompliziert es Ihren Code wirklich)Wenn Sie Probleme haben, sich an die Bestellung zu erinnern, denken Sie daran, dass Sie beim Vorlesen (fast) sagen, was Sie meinen. Zum Beispiel x = 4 if b > 8 else 9
wird vorgelesen als x will be 4 if b is greater than 8 otherwise 9
.
Offizielle Dokumentation:
f(x) = |x| = x if x > 0 else -x
klingt jedoch für Mathematiker sehr natürlich. Sie können es in den meisten Fällen auch als A verstehen, außer wenn C, dann sollten Sie stattdessen B tun ...
z = 3 + x if x < y else y
. Wenn x=2
und y=1
, könnten Sie erwarten, dass dies 4 ergibt, aber es würde tatsächlich 1 ergeben. Dies z = 3 + (x if x > y else y)
ist die richtige Verwendung.
z = 3 + x if x < y else 3 + y
) oder die Bedingung ( z = 3 + (x if x < y else y)
oder z = (x if x < y else y) + 3
)
Sie können in ein Tupel indizieren:
(falseValue, trueValue)[test]
test
muss True oder False zurückgeben .
Es könnte sicherer sein, es immer wie folgt zu implementieren:
(falseValue, trueValue)[test == True]
oder Sie können die integrierte Funktion verwenden bool()
, um einen Booleschen Wert sicherzustellen :
(falseValue, trueValue)[bool(<expression>)]
(lambda: print("a"), lambda: print("b"))[test==true]()
[]
s befindet, ein beliebiger Ausdruck sein kann. Aus Sicherheitsgründen können Sie die Wahrhaftigkeit auch explizit schriftlich prüfen [bool(<expression>)]
. Die bool()
Funktion gibt es seit v2.2.1.
True
und False
als Schlüssel indiziert habe : {True:trueValue, False:falseValue}[test]
Ich weiß nicht, ob dies weniger effizient ist, aber es vermeidet zumindest das Ganze "elegante" vs. "hässliche" Debatte. Es gibt keine Unklarheit, dass Sie es eher mit einem Booleschen als mit einem Int zu tun haben.
Für Versionen vor 2.5 gibt es den Trick:
[expression] and [on_true] or [on_false]
Es kann zu falschen Ergebnissen führen, wenn on_true
ein falscher Boolescher Wert vorliegt. 1
Obwohl es den Vorteil hat, Ausdrücke von links nach rechts zu bewerten, ist dies meiner Meinung nach klarer.
<expression 1> if <condition> else <expression 2>
a = 1
b = 2
1 if a > b else -1
# Output is -1
1 if a > b else -1 if a < b else 0
# Output is -1
Aus der Dokumentation :
Bedingte Ausdrücke (manchmal als "ternärer Operator" bezeichnet) haben die niedrigste Priorität aller Python-Operationen.
Der Ausdruck
x if C else y
bewertet zuerst die Bedingung C ( nicht x ); Wenn C wahr ist, wird x ausgewertet und sein Wert zurückgegeben. Andernfalls wird y ausgewertet und sein Wert zurückgegeben.Weitere Informationen zu bedingten Ausdrücken finden Sie in PEP 308 .
Neu seit Version 2.5.
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 besteht darin, ein Tupel zu indizieren (was nicht mit dem bedingten Operator der meisten anderen Sprachen übereinstimmt):
result = (y, x)[a > b]
oder explizit erstelltes Wörterbuch:
result = {True: x, False: y}[a > b]
Eine andere (weniger zuverlässige), aber einfachere Methode ist die Verwendung and
und die or
Bedienung:
result = (a > b) and x or y
Dies wird jedoch nicht funktionieren, wenn x
dies der Fall wäre False
.
Eine mögliche Problemumgehung besteht darin, x
wie folgt zu erstellen und y
aufzulisten oder zu tupeln:
result = ((a > b) and [x] or [y])[0]
oder:
result = ((a > b) and (x,) or (y,))[0]
Wenn Sie mit Wörterbüchern arbeiten, anstatt eine ternäre Bedingung zu verwenden, können Sie beispielsweise Folgendes nutzen get(key, default)
:
shell = os.environ.get('SHELL', "/bin/sh")
Quelle: ?: In Python bei Wikipedia
result = {1: x, 0: y}[a > b]
ist eine andere mögliche Variante ( True
und False
sind tatsächlich ganze Zahlen mit Werten 1
und 0
)
Leider ist die
(falseValue, trueValue)[test]
Lösung hat kein Kurzschlussverhalten; somit werden beide falseValue
und trueValue
unabhängig von der Bedingung ausgewertet. Dies kann suboptimal oder sogar fehlerhaft sein (dh beides trueValue
und falseValue
kann Methoden sein und Nebenwirkungen haben).
Eine Lösung hierfür wäre
(lambda: falseValue, lambda: trueValue)[test]()
(Ausführung verzögert, bis der Gewinner bekannt ist;)), führt jedoch zu Inkonsistenzen zwischen aufrufbaren und nicht aufrufbaren Objekten. Außerdem wird der Fall bei Verwendung von Eigenschaften nicht gelöst.
Und so geht die Geschichte weiter: Die Wahl zwischen drei genannten Lösungen ist ein Kompromiss zwischen der Kurzschlussfunktion, der Verwendung von mindestens 2.5ython 2.5 (meiner Meinung nach kein Problem mehr) und der trueValue
Nichtanfälligkeit für " -evaluates-to-false" -Fehler .
if else if
.
Hier versuche ich nur, einen wichtigen Unterschied ternary operator
zwischen einigen Programmiersprachen aufzuzeigen.
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 Operator 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
Für Python 2.5 und höher gibt es eine bestimmte Syntax:
[on_true] if [cond] else [on_false]
In älteren Pythons ist ein ternärer Operator nicht implementiert, aber es ist möglich, ihn zu simulieren.
cond and on_true or on_false
Obwohl, es ist ein potenzielles Problem, das wenn cond
auswertet zu True
und on_true
auswertet , um False
dann on_false
statt zurückgeführt wird 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
die verpackt werden kann durch:
def q(cond, on_true, on_false)
return {True: on_true, False: on_false}[cond is True]
und so verwendet:
q(cond, on_true, on_false)
Es ist mit allen Python-Versionen kompatibel.
q("blob", on_true, on_false)
zurück on_false
, während on_true if cond else on_false
zurückgegeben wird on_true
. Eine Abhilfe ist , zu ersetzen , cond
mit cond is not None
in diesen Fällen, aber das ist keine perfekte Lösung ist.
bool(cond)
statt cond is True
? Ersteres prüft die Richtigkeit von cond
, letzteres prüft die Zeigergleichheit mit dem True
Objekt. Wie von @AndrewCecil hervorgehoben, "blob"
ist es wahr, aber es is not True
.
[on_false, on_True][cond is True]
damit der Ausdruck kürzer wird.
Sie könnten oft finden
cond and on_true or on_false
Dies führt jedoch zu einem Problem, 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 des Interesses 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 (dh nur ausgewertet, wenn expression2
es in einem booleschen Kontext falsch ist). Und aufgrund der rekursiven Definition können Sie sie unbegrenzt verketten (obwohl dies als schlechter Stil angesehen werden kann.)
expression1 if expression2 else expression3 if expression4 else expression5 # and so on
Beachten Sie, dass jedem if
ein else
. Menschen, die Listenverständnisse und Generatorausdrücke lernen, können feststellen, dass dies eine schwierige Lektion ist - Folgendes 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 a SyntaxError: invalid syntax
. Das Obige ist also entweder eine unvollständige Logik (möglicherweise erwartet der Benutzer ein No-Op im falschen Zustand) oder es kann beabsichtigt sein, expression2 als Filter zu verwenden - stellt fest, dass Folgendes legal ist: Python:
[expression1 for element in iterable if expression2]
expression2
arbeitet als Filter für das Listenverständnis und ist kein ternärer bedingter Operator.
Es kann etwas schmerzhaft sein, Folgendes zu schreiben:
expression1 if expression1 else expression2
expression1
muss zweimal mit der oben genannten Verwendung bewertet werden. Es kann die Redundanz einschränken, wenn es sich lediglich um eine lokale Variable handelt. Eine gebräuchliche und performante pythonische Redewendung für diesen Anwendungsfall ist jedoch die Verwendung or
des Verknüpfungsverhaltens:
expression1 or expression2
Das ist in der Semantik gleichwertig. Beachten Sie, dass einige Style-Guides diese Verwendung aus Gründen der Klarheit möglicherweise einschränken - sie enthalten viel Bedeutung in sehr wenig Syntax.
expression1 or expression2
ähnlich sein und mit den gleichen Nachteilen / Positiven wie expression1 || expression2
in Javascript
expressionN
für alle Instanzen konsistent ist, ist es möglicherweise einfacher, die Benennung zu verstehen, die den bedingten Testausdruck von den beiden Ergebnisausdrücken unterscheidet. zB , result1 if condition else result2
. Dies ist besonders deutlich beim Verschachteln (auch bekannt als Verketten) : result1 if condition1 else result2 if condition2 else result3
. Sehen Sie, wie viel besser das so liest?
Simulation 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'
result = (y, x)[a < b]
Warum benutzt du lambda
Funktion ?
Der ternäre bedingte Operator ermöglicht einfach das Testen einer Bedingung in einer einzelnen Zeile, wobei die mehrzeilige ersetzt wird, wenn der Code sonst kompakt wird.
[on_true] if [expression] else [on_false]
# 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
# 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])
# lamda 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
# 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 geschrieben 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
if-else
kein Umschreiben des ternären Operators und erzeugt unterschiedliche Ausgaben für ausgewählte Werte von a und b (insbesondere, wenn es sich um einen Typ handelt, der eine seltsame __ne__
Methode implementiert ).
du kannst das :-
[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.
Hinweis: - 0, Keine, Falsch, Leerliste, leerString wird als Falsch ausgewertet. Alle anderen Daten als 0 werden mit True ausgewertet.
Wenn die Bedingung [Bedingung] "True" wird, wird expression_1 ausgewertet, nicht jedoch expression_2. Wenn wir etwas mit 0 (Null) "und", wird das Ergebnis immer fasle sein. Also in der folgenden Anweisung,
0 and exp
Der Ausdruck exp wird überhaupt nicht ausgewertet, da "und" mit 0 immer auf Null ausgewertet werden und der Ausdruck nicht ausgewertet werden muss. So funktioniert der Compiler selbst in allen Sprachen.
Im
1 or exp
Der Ausdruck exp wird überhaupt nicht ausgewertet, da "oder" mit 1 immer 1 ist. Es wird also nicht die Mühe machen, den Ausdruck exp auszuwerten, da das Ergebnis sowieso 1 ist. (Compiler-Optimierungsmethoden).
Aber im Falle von
True and exp1 or exp2
Der zweite Ausdruck exp2 wird nicht ausgewertet, da True and exp1
er wahr wäre, wenn exp1 nicht falsch ist.
Ähnlich in
False and exp1 or exp2
Der Ausdruck exp1 wird nicht ausgewertet, da False dem Schreiben von 0 entspricht und "und" mit 0 0 wäre, 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 wenn expression_1 wird False, dann wird der Ausdruck_2 aufgrund des Vorhandenseins "oder" zwischen exp_1 und exp_2 ausgewertet.
Wenn Sie dennoch möchten, dass es für alle Fälle funktioniert, unabhängig von den Wahrheitswerten exp_1 und exp_2, gehen Sie wie folgt vor:
[condition] and ([expression_1] or 1) or [expression_2] ;
x = [condition] and ([expression_1] or 1) or [expression_2]
und expression_1
als falsch auswerten möchten , x
wird dies 1
nicht der Fall sein expression_1
. Verwenden Sie die akzeptierte Antwort.
Eher ein Tipp als eine Antwort (ich muss das Offensichtliche nicht hundertmal wiederholen), aber ich verwende es manchmal als Oneliner-Verknüpfung 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 rubinrot) missbilligen, aber ich persönlich finde es natürlicher - dh wie Sie es normal ausdrücken würden, plus ein bisschen optisch ansprechender in großen Codeblöcken.
print( 'yes' if conditionX else 'nah' )
deine Antwort vor. :-)
print()
in beiden Fällen wollen - und es sieht ein bisschen pythonischer aus, muss ich zugeben :) Aber was ist, wenn die Ausdrücke / Funktionen nicht gleich sind - wie print('yes') if conditionX else True
- um das print()
einzig wahre zu bekommenconditionX
print('yes') if conditionX else print('nah')
ist, dass in Python2 ein SyntaxError angegeben wird.
print "yes"
während es in Python 3 eine Funktion ist - print("yes")
. Das kann gelöst werden, indem man es entweder als Aussage verwendet oder besser - from future import print_function
.
Eine der Alternativen zu Pythons bedingtem Ausdruck
"yes" if boolean else "no"
ist das Folgende:
{True:"yes", False:"no"}[boolean]
welches die folgende schöne Erweiterung hat:
{True:"yes", False:"no", None:"maybe"}[boolean_or_none]
Die kürzeste Alternative bleibt:
("no", "yes")[boolean]
aber es gibt keine Alternative zu
yes() if boolean else no()
wenn Sie die Auswertung von yes()
und vermeiden möchten no()
, weil in
(no(), yes())[boolean] # bad
beide no()
und yes()
werden ausgewertet.
Viele Programmiersprachen, die von abgeleitet sind, C
haben normalerweise die folgende Syntax des ternären bedingten Operators:
<condition> ? <expression1> : <expression2>
Zunächst wird die
Python
B enevolent D ictator F oder L (ich meine , Guido van Rossum, natürlich) ife es abgelehnt (als Nicht-Pythonic Stil), da es sehr schwer für die Menschen zu verstehen , nicht verwendetC
Sprache. Auch das Doppelpunktzeichen hat:
bereits viele Verwendungszwecke inPython
. Nachdem PEP 308 genehmigt wurde,Python
erhielt es schließlich einen eigenen bedingten Shortcut-Ausdruck (was wir jetzt verwenden):
<expression1> if <condition> else <expression2>
Zunächst wird also der Zustand bewertet. Wenn es zurückkehrt True
, wird Ausdruck1 ausgewertet, um das Ergebnis zu erhalten, andernfalls wird Ausdruck2 ausgewertet. Aufgrund der Lazy Evaluation- Mechanik wird nur ein Ausdruck ausgeführt.
Hier einige Beispiele (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'
Das folgende ist das gleiche wie das vorherige:
pressure = 5
if pressure < 20:
if pressure < 10:
print('Normal')
else:
print('High')
else:
print('Critical')
# Result is 'Normal'
Hoffe das hilft.
Wie bereits beantwortet, gibt es in Python einen ternären Operator:
<expression 1> if <condition> else <expression 2>
Zusätzliche Information:
Wenn dies <expression 1>
die Bedingung ist, können Sie die Kurzschlussbewertung verwenden :
a = True
b = False
# Instead of this:
x = a if a else b
# You could use Short-cirquit evaluation:
x = a or b
PS: Natürlich ist eine Kurzschlussbewertung kein ternärer Operator, aber häufig wird der ternäre Operator in Fällen verwendet, in denen der Kurzschluss ausreichen würde.
short-circuit
Bewertung.
JA, Python hat einen ternären Operator, hier ist die Syntax und ein Beispielcode, um dasselbe 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")
print
ist wirklich keine gute Wahl, da dies einen SyntaxError in Python2 ergibt.
Python hat eine ternäre Form für Aufgaben; Es kann jedoch auch eine kürzere Form geben, die den Menschen bekannt sein sollte.
Es ist sehr häufig erforderlich, einer Variablen je nach Bedingung den einen oder anderen Wert zuzuweisen.
>>> li1 = None
>>> li2 = [1, 2, 3]
>>>
>>> if li1:
... a = li1
... else:
... a = li2
...
>>> a
[1, 2, 3]
^ Dies ist die Langform für solche Aufgaben.
Unten ist die ternäre Form. Dies ist jedoch nicht besonders prägnant - siehe letztes Beispiel.
>>> a = li1 if li1 else li2
>>>
>>> a
[1, 2, 3]
>>>
Mit Python können Sie einfach or
alternative Aufgaben verwenden.
>>> a = li1 or li2
>>>
>>> a
[1, 2, 3]
>>>
Die oben genannten Arbeiten da li1
ist None
und die Interp behandelt , dass False in logischen Ausdrücken. Die Interp geht dann weiter und wertet den zweiten Ausdruck aus, der nicht None
und keine leere Liste ist - also wird er einem zugewiesen.
Dies funktioniert auch mit leeren Listen. Zum Beispiel, wenn Sie die a
Liste mit Elementen zuweisen möchten .
>>> li1 = []
>>> li2 = [1, 2, 3]
>>>
>>> a = li1 or li2
>>>
>>> a
[1, 2, 3]
>>>
Wenn Sie dies wissen, können Sie solche Aufgaben einfach ausführen, wenn Sie auf sie stoßen. Dies funktioniert auch mit Zeichenfolgen und anderen iterablen Elementen. Sie können die a
Zeichenfolge zuweisen, die nicht leer ist.
>>> s1 = ''
>>> s2 = 'hello world'
>>>
>>> a = s1 or s2
>>>
>>> a
'hello world'
>>>
Die ternäre Syntax hat mir immer gefallen, aber Python geht noch einen Schritt weiter!
Ich verstehe, dass einige sagen mögen, dass dies keine gute stilistische Wahl ist, da sie auf Mechaniken beruht, die nicht für alle Entwickler sofort ersichtlich sind. Ich persönlich bin mit diesem Standpunkt nicht einverstanden. Python ist eine syntaxreiche Sprache mit vielen idiomatischen Tricks, die dem Dabler nicht sofort klar sind. Aber je mehr Sie die Mechanik des zugrunde liegenden Systems lernen und verstehen, desto mehr schätzen Sie es.
Andere Antworten sprechen korrekt über den ternären Python-Operator. Ich möchte dies ergänzen, indem ich ein Szenario erwähne, für das der ternäre Operator häufig verwendet wird, für das es jedoch eine bessere Sprache gibt. Dies ist das Szenario der Verwendung eines Standardwerts.
Angenommen, wir möchten option_value
einen Standardwert verwenden, wenn dieser nicht festgelegt ist:
run_algorithm(option_value if option_value is not None else 10)
oder einfach
run_algorithm(option_value if option_value else 10)
Eine immer bessere Lösung ist jedoch einfach zu schreiben
run_algorithm(option_value or 10)
Wenn eine Variable definiert ist und Sie überprüfen möchten, ob sie einen Wert hat, können Sie dies einfach tun 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
x if x else y
, aber nicht x if z else y
.
Eine gute Möglichkeit, mehrere Operatoren zu verketten:
f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'
array = [(0,0),(0,1),(1,0),(1,1)]
for a in array:
x, y = a[0], a[1]
print(f(x,y))
# Output is:
# equal,
# less,
# greater,
# equal
Ich finde die Standard-Python-Syntax umständlich val = a if cond else b
, deshalb mache ich manchmal Folgendes:
iif = lambda (cond, a, b): a if cond else b
# so I can then use it like:
val = iif(cond, a, b)
Natürlich hat es den Nachteil, immer beide Seiten (a und b) zu bewerten, aber die Syntax ist mir viel klarer
val = a if cond else b
Aussage.
is_spacial=True if gender = "Female" else (True if age >= 65 else False)
** **.
Es kann nach Bedarf verschachtelt werden. viel Glück
** **.