Python possède un style d'écriture appelé opérateurs ternaires (opérateurs conditionnels) qui permet de décrire un processus comme une instruction if en une seule ligne.
Ce qui suit est expliqué ici, avec un exemple de code.
- Écriture de base des opérateurs ternaires
if ... elif ... else ...
Décrivez-le en une ligne- Notation complète de la liste des combinaisons et opérateurs ternaires
- Combinaison de fonctions anonymes (expressions lambda) et d'opérateurs ternaires
Consultez l'article suivant pour plus d'informations sur l'instruction if normale.
Écriture de base des opérateurs ternaires
En Python, l'opérateur ternaire peut être écrit comme suit
Expression evaluated when the conditional expression is true if conditional expression else Expression evaluated when the conditional expression is false
Si vous voulez changer de valeur en fonction des conditions, il suffit d'écrire chaque valeur telle quelle.
Value to return if conditional expression is true if conditional expression else Value to return if conditional expression is false
a = 1
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# odd
a = 2
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# even
Si vous voulez changer de traitement en fonction des conditions, décrivez chaque expression.
a = 1
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 3
a = 2
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 4
Les expressions qui ne renvoient pas de valeur (expressions qui renvoient None) sont également acceptables. Selon la condition, une des expressions est évaluée et le processus est exécuté.
a = 1
print('even') if a % 2 == 0 else print('odd')
# odd
Equivalent au code suivant écrit avec une instruction if normale.
a = 1
if a % 2 == 0:
print('even')
else:
print('odd')
# odd
Plusieurs expressions conditionnelles peuvent également être concaténées à l'aide d'opérateurs logiques (et, ou, etc.).
- RELATED :Opérateurs logiques Python et, ou, pas (conjonction logique, disjonction logique, négation)
a = -2
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# negative and even
a = -1
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# positive or odd
if ... elif ... else ...Description d'une ligne
if ... elif ... else ...
Il n'y a pas de moyen particulier d'écrire cela sur une seule ligne. Cependant, elle peut être réalisée en utilisant un autre opérateur ternaire dans l'expression qui est évaluée lorsque l'expression conditionnelle de l'opérateur ternaire est fausse. Image des opérateurs ternaires imbriqués.
Toutefois, il est préférable de ne pas l'utiliser de manière extensive car elle réduit la lisibilité.
a = 2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# positive
a = 0
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# zero
a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative
L'expression conditionnelle suivante peut être interprétée des deux manières suivantes, mais elle est traitée comme la première (1).
A if condition 1 else B if condition 2 else C
1. A if condition 1 else ( B if condition 2 else C )
2. ( A if condition 1 else B ) if condition 2 else C
Un exemple concret est le suivant. La première expression est considérée comme si elle était la seconde.
a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative
result = 'negative' if a < 0 else ('positive' if a > 0 else 'zero')
print(result)
# negative
result = ('negative' if a < 0 else 'positive') if a > 0 else 'zero'
print(result)
# zero
Notation complète de la liste des combinaisons et opérateurs ternaires
Une utilisation utile de l'opérateur ternaire est le traitement des listes en notation de compréhension de liste.
En combinant l'opérateur ternaire et la notation de compréhension de liste, il est possible de remplacer les éléments d'une liste ou d'effectuer un autre traitement en fonction des conditions.
l = ['even' if i % 2 == 0 else i for i in range(10)]
print(l)
# ['even', 1, 'even', 3, 'even', 5, 'even', 7, 'even', 9]
l = [i * 10 if i % 2 == 0 else i for i in range(10)]
print(l)
# [0, 1, 20, 3, 40, 5, 60, 7, 80, 9]
Pour plus d'informations sur la notation de la compréhension des listes, voir l'article suivant.
Combinaison de fonctions anonymes (expressions lambda) et d'opérateurs ternaires
L'opérateur ternaire, qui peut être décrit de manière concise même dans une fonction anonyme (expression lambda), est utile.
get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'
print(get_odd_even(1))
# odd
print(get_odd_even(2))
# even
Notez que, bien que sans rapport avec l'opérateur ternaire, l'exemple ci-dessus attribue un nom à l'expression lambda. Par conséquent, les outils de vérification automatique tels que la convention de codage PEP8 de Python peuvent générer un avertissement.
En effet, PEP8 recommande l'utilisation de def pour attribuer des noms aux fonctions.
Le concept du PEP8 est le suivant
- Les expressions lambda sont utilisées pour passer des objets appelables comme arguments, par exemple, sans les nommer
- Dans les expressions lambda, utilisez def pour définir par nom