Comment utiliser l’opérateur ternaire Python



Ce guide vous familiarisera avec l’utilisation de l’opérateur conditionnel ternaire en Python. Vous explorerez sa syntaxe et développerez plusieurs exemples pour assimiler son fonctionnement.

Nous commencerons par une révision du fonctionnement de la structure conditionnelle if-else, puis nous apprendrons comment formuler une expression équivalente à l’aide de l’opérateur ternaire.

Par la suite, nous coderons quelques cas pratiques, puis nous découvrirons comment reproduire le comportement de l’opérateur ternaire de Python en employant un tuple et un dictionnaire. Enfin, nous analyserons quelques contextes d’application où il est préférable d’utiliser l’opérateur ternaire.

Allons-y !

Révision de la structure If-Else en Python

Vous pouvez démarrer un interpréteur Python (REPL) ou travailler dans l’éditeur Python en ligne de toptips.fr pour les exercices.

Voici la syntaxe de base de l’instruction if-else en Python :

if condition:
    # exécuter ceci
else:
    # exécuter cela

Dans le schéma ci-dessus, ‘condition’ est l’expression à évaluer. Si la ‘condition’ est vraie (True), le bloc ‘if’ est exécuté. Dans le cas contraire (si la ‘condition’ est fausse – False), les instructions dans le bloc ‘else’ sont exécutées.

Voici un exemple où la variable ‘game_over’ reçoit une valeur booléenne déterminée par le fait que la valeur de ‘energy’ soit inférieure ou égale à zéro :

  • Si ‘energy’ <= 0, ‘game_over’ est True.
  • Sinon, ‘game_over’ est False.

Le code suivant illustre comment réaliser cela avec les instructions conditionnelles if-else :

energy = -1

if energy <= 0:
    game_over = True
else:
    game_over = False

print(game_over)
# True

Dans cet exemple, ‘energy’ vaut -1, qui est inférieur à 0. Donc, ‘game_over’ devient True.

Syntaxe et Exemples de l’Opérateur Ternaire Python

Python propose un opérateur ternaire, qui fonctionne d’une manière similaire à l’opérateur conditionnel ternaire dans des langages tels que C et C++. Sa syntaxe générale est la suivante :

expression1 if condition else expression2

Décortiquons cette syntaxe :

  • ‘condition’ : l’expression à tester.
  • ‘expression1’ : l’expression à évaluer si la condition est vraie.
  • ‘expression2’ : l’expression à évaluer si la condition est fausse.

Nous allons maintenant identifier les correspondances entre ‘expression1’, ‘expression2’, et ‘condition’ par rapport à la version du code utilisant if-else.

En combinant ces éléments, voici le résultat en utilisant l’opérateur ternaire de Python :

game_over = True if energy <= 0 else False
print(game_over)
# True

Considérons un autre exemple. Imaginons que vous gériez une librairie et que vous offriez des réductions à vos clients en fonction de la fréquence de leurs visites durant la dernière année.

Soit ‘numVisits’ le nombre de visites.

  • Si ‘numVisits’ > 7, le pourcentage de réduction, ‘discount_perc’, est de 20.
  • Sinon, ‘discount_perc’ est de 5.

Nous utilisons l’opérateur ternaire pour affecter une valeur à la variable ‘discount_perc’ :

numVisits = 10

discount_perc = 20 if numVisits > 7 else 5

print(discount_perc)
# 20 (car numVisits = 10, ce qui est > 7)

Ensuite, nous allons apprendre à simuler l’opérateur ternaire avec un tuple et un dictionnaire Python.

Simulation de l’Opérateur Ternaire avec un Tuple Python

Comme tous les itérables en Python, les tuples sont indexés à partir de zéro. Ainsi, dans un tuple de deux éléments, ‘tuple_name[0]’ désigne le premier élément et ‘tuple_name[1]’ le second.

Les types de données fondamentaux en Python sont les entiers, les nombres à virgule flottante, les chaînes de caractères et les booléens. Python permet des conversions de type, vous autorisant à exprimer une donnée d’un type particulier par son équivalent dans un autre type.

Ouvrez un interpréteur Python et exécutez les exemples suivants. Si vous tentez de convertir des entiers en booléens, vous observerez :

  • bool(0) retourne False.
  • bool() retourne True.
>>> bool(0)
False
>>> bool(1)
True
>>> bool(-1)
True
>>> bool(10)
True

De même, lors de la conversion de booléens en entiers, nous obtenons :

>>> int(True)
1
>>> int(False)
0

En associant la conversion de type et l’indexation, nous pouvons procéder comme suit :

  • Élément à l’index 0 dans le tuple : la valeur à utiliser lorsque la condition est fausse.
  • Élément à l’index 1 dans le tuple : la valeur à utiliser lorsque la condition est vraie.

En appliquant ce qui précède, nous obtenons ceci :

>>> numVisits = 10
>>> discount_perc = (5,20)[numVisits > 7]
>>> discount_perc
# 20

Ici, la condition ‘numVisits > 7’ est True car ‘numVisits’ vaut 10. Puisque int(True) est 1, la valeur de ‘discount_perc’ devient 20, l’élément à l’index 1.

Simulation de l’Opérateur Ternaire avec un Dictionnaire Python

Vous pouvez définir True et False comme clés d’un dictionnaire. Puis, vous pouvez associer ‘expression1’ et ‘expression2’ comme valeurs correspondant respectivement aux clés True et False.

some_dict = {True: expression1,
             False: expression2
            }

Quelle est la suite ? En utilisant ‘some_dict[condition]’, ‘expression1’ liée à la clé True est évaluée si la ‘condition’ est True. Et ‘expression2’ est évaluée lorsque la ‘condition’ est False.

Reprenons l’exemple de ‘discount_perc’, mais cette fois en utilisant un dictionnaire Python.

>>> numVisits = 10
>>> discount_dict = {True: 20, False:5}
>>> discount_perc = discount_dict[numVisits > 7]
>>> discount_perc
# 20

Ici, ‘numVisits’ = 10, ce qui est supérieur à 7. Par conséquent, la condition ‘numVisits > 7’ est True. Donc, ‘discount_dict[numVisits > 7]’ est évalué à ‘discount_dict[True]’, dont la valeur est 20.

Faut-il Toujours Utiliser l’Opérateur Ternaire Python ?

Jusqu’ici, nous avons exploré l’utilisation de l’opérateur ternaire. Mais, devrions-nous systématiquement l’utiliser ? En réalité, l’opérateur ternaire n’est pas toujours le meilleur choix. Cette partie explique quand il est préférable d’opter pour l’opérateur ternaire plutôt que pour les instructions if-else. Nous verrons également dans quels cas il est plus judicieux de privilégier l’instruction if-else plutôt que l’opérateur ternaire.

Plus Concis que les Blocs If-Else

Comme mentionné précédemment, en Python, l’expression de l’opérateur ternaire est plus concise que l’instruction if-else. Elle est donc utile pour vérifier des conditions et évaluer des expressions conditionnellement et rapidement.

Dans l’exemple ci-dessous, ‘nums’ est une liste de 100 entiers générés aléatoirement. Pour chaque nombre, on vérifie s’il est pair ou impair. Cette évaluation est effectuée directement dans la f-string.

import random

nums = [random.choice(range(100)) for i in range(10)]

for num in nums:
    print(f"{num} is {'even' if num%2==0 else 'odd'}")
# exemple de sortie

0 is even
56 is even
6 is even
53 is odd
62 is even
7 is odd
8 is even
77 is odd
41 is odd
94 is even

L’Opérateur Ternaire Nécessite la Clause Else

Lors de l’utilisation des instructions conditionnelles if-else, la clause ‘else’ est facultative. Prenons un exemple : la variable ‘game_over’ est définie à True si l’énergie descend à une valeur inférieure ou égale à zéro.

Cependant, si l’énergie est supérieure à zéro, la variable ‘game_over’ n’est jamais initialisée. Par conséquent, vous rencontrerez des erreurs si vous tentez d’accéder à ‘game_over’.

energy = 5
if energy <= 0:
    game_over = True

print(f"Is the game over? {game_over}")
Traceback (most recent call last):
  File "ternary_op.py", line 39, in <module>
    print(f"Is the game over? {game_over}")
NameError: name 'game_over' is not defined

Une solution consiste à définir initialement ‘game_over’ à False, puis à le modifier à True si le niveau d’énergie est inférieur ou égal à zéro.

energy = 5
game_over = False
if energy <= 0:
    game_over1 = True

print(f"Is the game over? {game_over}")

Cependant, lors de l’utilisation de l’opérateur ternaire Python équivalent à ce qui précède, la clause ‘else’ est obligatoire. L’opérateur ternaire exige que l’expression soit évaluée lorsque la condition est fausse.

game_over = True if energy <= 0 else False

Si vous modifiez l’expression ci-dessus en ‘game_over = True if energy <= 0’ en supprimant la partie ‘else’, vous obtiendrez une erreur de syntaxe, comme indiqué ci-dessous :

File "ternary_op.py", line 42
    game_over = True if energy <= 0
                                  ^
SyntaxError: invalid syntax

Pour Vérifier Plusieurs Conditions, Utilisez les Instructions If-Else

Prenons un autre exemple : chaque question d’un ensemble de questions d’entretien de codage possède un score de difficulté. En fonction de ce score, nous assignons l’un des trois niveaux de difficulté : facile, moyen ou difficile à une question. Supposons les correspondances suivantes :

ScoreNiveau de difficultéMoins de 10facileEntre 10 et 20moyenSupérieur à 20difficile

À partir du score de difficulté, vous pouvez obtenir le niveau de difficulté correspondant en utilisant l’opérateur ternaire Python comme suit :

score = 12

difficulty_level = "easy" if score < 10 else "hard" if score > 20 else "medium"

print(difficulty_level)
# medium

L’expression de l’opérateur ternaire dans le code ci-dessus prend la forme suivante :

expression1 if condition1 else expression2 if condition2 else expression3

Bien que concise, elle est quelque peu difficile à lire et à comprendre. L’illustration suivante montre le flux de contrôle dans ce cas.

L’extrait de code suivant montre une implémentation équivalente en utilisant des instructions if-else. Comme on peut le voir, le flux de contrôle est plus facile à comprendre et le code plus lisible.

if score < 10:
    difficulty_level="easy"
elif score > 20:
    difficulty_level="hard"
else:
    difficulty_level="medium"

print(difficulty_level)

Par conséquent, lorsque vous avez plusieurs conditions, il est conseillé d’utiliser les blocs if-else plutôt que l’opérateur ternaire, assurant ainsi une meilleure lisibilité et compréhension du code.

De plus, lorsque plusieurs instructions doivent être exécutées en fonction de la vérité ou de la fausseté de la condition, il est préférable d’utiliser l’instruction if-else.

Conclusion

Voici un résumé de ce que vous avez appris dans ce tutoriel.

  • En Python, l’opérateur ternaire s’utilise avec la syntaxe : ‘expression1 if condition else expression2’.
  • Vous pouvez simuler le fonctionnement de l’opérateur ternaire en utilisant des tuples et des dictionnaires Python.
  • Bien que l’opérateur ternaire puisse être une alternative plus compacte aux blocs if-else, il faut veiller à ce que le code reste lisible. Pour optimiser la lisibilité du code, il est souvent préférable d’utiliser les instructions if-else plutôt que l’opérateur ternaire, notamment quand de multiples conditions sont impliquées.

Pour aller plus loin, consultez le tutoriel sur les opérateurs d’égalité et de différence en Python.