Heeft Python een ternaire voorwaardelijke operator?

Als Python geen ternaire voorwaardelijke operator heeft, is het dan mogelijk om er een te simuleren met behulp van andere taalconstructies?

Oplossing

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

  • De volgorde van de argumenten is anders dan die van de klassieke 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).
  • Sommigen vinden het "onhandelbaar", omdat het ingaat tegen de normale gedachtestroom (eerst denken aan de voorwaarde en dan aan de gevolgen).
  • Stilistische redenen. (Hoewel de 'inline 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:

Commentaren (10)

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.

  1. Is er een equivalent van C's "?:" ternaire operator?
Commentaren (4)

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.

Commentaren (0)