Als Python geen ternaire voorwaardelijke operator heeft, is het dan mogelijk om er een te simuleren met behulp van andere taalconstructies?
Ja, het werd toegevoegd in versie 2.5. De expressie syntaxis is:
a if condition else b
Eerst wordt voorwaarde
geëvalueerd, dan wordt precies één van a
of b
geëvalueerd en geretourneerd op basis van de Booleaanse waarde van voorwaarde
. Als condition
evalueert naar True
, dan wordt a
geëvalueerd en teruggegeven maar b
wordt genegeerd, of anders als b
wordt geëvalueerd en teruggegeven maar a
wordt genegeerd.
Dit maakt kortsluiting mogelijk, want als voorwaarde
waar is, wordt alleen a
geëvalueerd en b
helemaal niet, maar als voorwaarde
onwaar is, wordt alleen b
geëvalueerd en a
helemaal niet.
Bijvoorbeeld:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Merk op dat conditionals een expressie zijn, geen statement. Dit betekent dat je geen toewijzingsstatements of pass
of andere statements kunt gebruiken binnen een conditionele expressie:
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
Je kunt echter wel voorwaardelijke expressies gebruiken om een variabele toe te wijzen, zoals dit:
x = a if True else b
Denk aan de voorwaardelijke uitdrukking als het schakelen tussen twee waarden. Het is erg handig wanneer je'in een 'de ene waarde of de andere' situatie zit, het maar'doet verder niet veel.
Als je verklaringen moet gebruiken, moet je een normaal if
statement gebruiken in plaats van een voorwaardelijke expressie.
Houd in gedachten dat het door sommige Pythonistas wordt afgekeurd om verschillende redenen:
voorwaarde ? a : b
ternaire operator uit vele andere talen (zoals C, C++, Go, Perl, Ruby, Java, Javascript, enz.), wat tot bugs kan leiden wanneer mensen die niet bekend zijn met Python's "verrassend" gedrag het gebruiken (ze kunnen de argumentvolgorde omkeren).if
' echt nuttig kan zijn, en je script beknopter kan maken, maakt het je code wel ingewikkelder)Als je'moeite hebt met het onthouden van de volgorde, bedenk dan dat als je hardop leest, je (bijna) zegt wat je bedoelt. Bijvoorbeeld, x = 4 als b > 8 anders 9
wordt hardop gelezen als x zal 4 zijn als b groter is dan 8 anders 9
.
Officiële documentatie:
Voor versies voor 2.5, daar's de truc:
[expression] and [on_true] or [on_false]
Het kan verkeerde resultaten geven wanneer on_true
een valse boolean waarde heeft.1
Hoewel het wel het voordeel heeft dat expressies van links naar rechts worden geëvalueerd, wat naar mijn mening duidelijker is.
Uit de documentatie:
Voorwaardelijke expressies (soms een "ternaire operator" genoemd) hebben de laagste prioriteit van alle Python-bewerkingen.
De uitdrukking
x if C else y
evalueert eerst de voorwaarde, C (niet x); als C waar is, wordt x geëvalueerd en de waarde ervan geretourneerd; anders wordt y geëvalueerd en de waarde ervan geretourneerd.Zie PEP 308 voor meer details over voorwaardelijke expressies.
Nieuw sinds versie 2.5.