Oui, il a été ajouté dans la version 2.5. La syntaxe de l'expression est :
a if condition else b
Tout d'abord, condition
est évaluée, puis exactement l'un des éléments a
ou b
est évalué et retourné en fonction de la valeur booléenne de condition
. Si condition
est évaluée à True
, alors a
est évalué et retourné mais b
est ignoré, sinon lorsque b
est évalué et retourné mais a
est ignoré.
Cela permet un court-circuit car lorsque condition
est vraie, seul a
est évalué et b
n'est pas du tout évalué, mais lorsque condition
est fausse, seul b
est évalué et a
n'est pas du tout évalué.
Par exemple :
>>> 'vrai' if True else 'faux'
'vrai'
>>> 'vrai' if False else 'faux'
'faux'
Remarque que les conditionnelles sont une expression, pas une déclaration. Cela signifie que vous ne pouvez pas utiliser de déclarations telles que pass
, ou des affectations avec =
(ou des affectations "augmentées" comme +=
), à l'intérieur d'une expression conditionnelle :
>>> pass if False else pass
File "", line 1
pass if False else pass
^
SyntaxError: syntaxe invalide
>>> # Python analyse ceci comme `x = (1 if False else y) = 2`
>>> # La partie `(1 if False else x)` est en fait valide, mais
>>> # elle ne peut pas être du côté gauche de `=`.
>>> x = 1 if False else y = 2
File "", line 1
SyntaxError: impossible d'assigner à une expression conditionnelle
>>> # Si nous parenthésageons à la place...
>>> (x = 1) if False else (y = 2)
File "", line 1
(x = 1) if False else (y = 2)
^
SyntaxError: syntaxe invalide
(À partir de la version 3.8, l'opérateur "morse" :=
permet l'affectation simple de valeurs comme une expression, ce qui est alors compatible avec cette syntaxe. Mais veuillez ne pas écrire un code de cette façon ; cela deviendra rapidement très difficile à comprendre.)
De même, étant donné qu'il s'agit d'une expression, la partie else
est obligatoire :
# Syntaxe invalide : nous n'avons pas spécifié ce que la valeur devrait être si la
# condition n'est pas remplie. Peu importe si nous pouvons vérifier cela
# à l'avance.
a if True
Cependant, vous pouvez utiliser des expressions conditionnelles pour affecter une variable comme ceci :
x = a if True else b
Ou par exemple pour retourner une valeur :
# Bien sûr, nous devrions juste utiliser la bibliothèque standard `max`;
# ceci est juste à titre de démonstration.
def my_max(a, b):
return a if a > b else b
Pensez à l'expression conditionnelle comme un commutateur entre deux valeurs. Nous pouvons l'utiliser lorsque nous sommes dans une situation de 'une valeur ou une autre', où nous allons faire la même chose avec le résultat, peu importe si la condition est remplie. Nous utilisons l'expression pour calculer la valeur, puis faisons quelque chose avec elle. Si vous avez besoin de faire quelque chose de différent en fonction de la condition, utilisez ensuite une if
normale déclaration à la place.
Gardez à l'esprit que cela est mal vu par certains Pythonistes pour plusieurs raisons :
- L'ordre des arguments est différent de celui de l'opérateur ternaire classique
condition ? a : b
de nombreux autres langages (comme C, C++, Go, Perl, Ruby, Java), JavaScript, etc.), ce qui peut entraîner des bugs lorsque des personnes peu familières avec le comportement "surprenant" de Python l'utilisent (elles peuvent inverser l'ordre des arguments).
- Certains le trouvent "maladroit", car cela va à l'encontre du flux de pensée normal (penser d'abord à la condition puis aux effets).
- Raisons stylistiques. (Bien que l' 'inline
if
' puisse être vraiment utile, et rendre votre script plus concis, cela complique vraiment votre code)
Si vous avez du mal à vous souvenir de l'ordre, alors souvenez-vous que lorsqu'on lit à voix haute, vous dites (presque) ce que vous voulez dire. Par exemple, x = 4 if b > 8 else 9
se lit à voix haute comme x sera 4 si b est supérieur à 8 sinon 9
.
Documentation officielle :
4 votes
Bien que les versions de Python antérieures à 2.5 s'éloignent lentement de l'histoire, voici une liste d'anciens astuces d'opérateur ternaire pré-2.5 : "Python Idioms", recherchez le texte 'Conditional expression' . Wikipedia est également très utile :-)
171 votes
Dans la documentation officielle de Python 3.0 mentionnée dans un commentaire ci-dessus, cela est appelé "expressions conditionnelles" et est défini de manière très cryptique. Cette documentation n'inclut même pas le terme "ternaire", donc vous auriez du mal à le trouver via Google à moins de savoir exactement ce que vous recherchez. La documentation de la version 2 est un peu plus utile et inclut un lien vers "PEP 308", qui comprend beaucoup de contexte historique intéressant lié à cette question.
35 votes
"ternaire" (ayant trois entrées) est une propriété conséquente de cette implémentation, et non une propriété définissante du concept. Ex : SQL a
case [...] { when ... then ...} [ else ... ] end
pour un effet similaire mais pas du tout ternaire.13 votes
Aussi la norme ISO/CEI 9899 (la norme du langage de programmation C) section 6.5.15 l'appelle "l'opérateur conditionnel"
11 votes
Wikipedia couvre cela de manière approfondie dans l'article "?:".
1 votes
Il est mentionné ici docs.python.org/3/faq/…, mais pas mentionné dans la bibliothèque standard de Python.
13 votes
Dans les années qui ont suivi le commentaire de nobar, la documentation de l'expression conditionnelle a été mise à jour pour dire Expressions conditionnelles (parfois appelées « opérateur ternaire »)...
1 votes
Je me demande parfois comment il est possible qu'une question fermée, qui requiert une réponse par oui ou par non, reçoive 26 réponses.
1 votes
@KaanE. et surtout en étant des copier-coller l'un de l'autre avec des commentaires différents. Donc, la valeur se trouve dans les commentaires... Quoi qu'il en soit, en 2020, la réponse complète se trouve dans la documentation des 'Opérateurs ternaires' : "Les opérateurs ternaires sont plus communément connus sous le nom d'expressions conditionnelles [...] ils sont devenus une partie de Python dans la version 2.4."