Écrire des instructions if en une ligne avec l’opérateur ternaire de Python (opérateur conditionnel)

Affaires

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.).

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