Python possède-t-il un opérateur conditionnel ternaire ?

Si Python n'a pas d'opérateur conditionnel ternaire, est-il possible d'en simuler un en utilisant d'autres constructions du langage ?

Solution

Oui, elle a été [ajoutée][1] dans la version 2.5. La syntaxe de l'expression est la suivante :

a if condition else b

D'abord, condition est évaluée, puis exactement l'un de a ou b est évalué et retourné en fonction de la valeur [booléenne][4] de condition. Si condition vaut Vrai, alors a est évalué et retourné mais b est ignoré, ou sinon quand b est évalué et retourné mais a est ignoré.

Cela permet le court-circuitage car lorsque condition est vrai, seul a est évalué et b n'est pas évalué du tout, mais lorsque condition est faux, seul b est évalué et a n'est pas évalué du tout.

Par exemple :

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

Notez que les conditionnelles sont une expression, pas un état. Cela signifie que vous ne pouvez pas utiliser d'instructions d'affectation ou de pass ou d'autres états dans une expression conditionnelle :

>>> pass if False else x = 3
  File "", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

Vous pouvez cependant utiliser des expressions conditionnelles pour assigner une variable comme ceci :

x = a if True else b

Pensez à l'expression conditionnelle comme à une commutation entre deux valeurs. Elle est très utile lorsque vous êtes dans une situation de "une valeur ou une autre", mais elle ne fait pas grand-chose d'autre.

Si vous avez besoin d'utiliser des instructions, vous devez utiliser un if normal état au lieu d'une expression conditionnelle.


Gardez à l'esprit que cette méthode est désapprouvée par certains Pythonistes pour plusieurs raisons :

  • L'ordre des arguments est différent de ceux de l'opérateur ternaire classique condition ? a : b de nombreux autres langages (tels que C, C++, Go, Perl, Ruby, Java, Javascript, etc.), ce qui peut conduire à des bogues lorsque des personnes non familières avec le comportement "surprenant" de Python l'utilisent (elles peuvent inverser l'ordre des arguments).
  • Certains le trouvent "lourd", car il va à l'encontre du flux normal de la pensée (penser d'abord à la condition et ensuite aux effets).
  • Des raisons stylistiques. (Bien que le "inline if" puisse être réellement utile, et rendre votre script plus concis, il complique vraiment votre code).

Si vous avez du mal à vous souvenir de l'ordre, rappelez-vous que lorsque vous lisez à haute voix, vous dites (presque) ce que vous voulez dire. Par exemple, x = 4 si b > 8 sinon 9 est lu à haute voix comme x sera 4 si b est supérieur à 8 sinon 9.

Documentation officielle :

Commentaires (10)

Pour les versions antérieures à la 2.5, il y a une astuce :

[expression] and [on_true] or [on_false]

Il peut donner des résultats erronés lorsque on_true a une valeur booléenne fausse.1 Bien qu'il ait l'avantage d'évaluer les expressions de gauche à droite, ce qui est plus clair à mon avis.

  1. [Existe-t-il un équivalent de l'opérateur ternaire " ? : " du C ?][1].

[1] : http://docs.python.org/3.3/faq/programming.html#is-there-an-equivalent-of-c-s-ternary-operator

Commentaires (4)

Extrait de [la documentation] :

Les expressions conditionnelles (parfois appelées "opérateur ternaire") ont la plus faible priorité de toutes les opérations Python.

L'expression x if C else y évalue d'abord la condition, C (not x) ; si C est vrai, x est évalué et sa valeur est retournée ; sinon, y est évalué et sa valeur est retournée.

Voir [PEP 308] pour plus de détails sur les expressions conditionnelles.

Nouveau depuis la version 2.5.

[La documentation] : https://docs.python.org/3/reference/expressions.html#conditional-expressions "Expressions conditionnelles". [PEP 308] : https://www.python.org/dev/peps/pep-0308/ "PEP 308 -- Expressions conditionnelles".

Commentaires (0)