Aller au contenu

Opérateur ternaire

I. Expression⚓︎

Expression

Dans une première approche, on peut considérer qu'une expression est quelque chose qui peut être évaluée.

Exemples

  • 3 + 2est une expression évaluée à 5.
  • 5 == 3est une expression (booléenne) évaluée à False
  • a % 2est une expression évaluée au reste de la division euclidienne de a par 2
  • x = 5 n'est pas une expression. C'est une instruction (ici une affectation)
  • 5 est une expression évaluée à ... 5
  • "Hello" est une expression évaluée à ... "Hello"

II. Expression conditionnelle⚓︎

Syntaxe et définition

La syntaxe est la suivante :
expression_1 if condition else expression_2
avec : expression_1, condition et expression_2 qui doivent être des expressions.

À vous de jouer 1

Exécuter le script ci-dessous, puis faire différents essais en console (par exemple appeler mineur_majeur(15)).

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Que s'est-il passé ?

Dans cet exemple "majeur" if age >= 18 else "mineur" est une expression qui est évaluée à "majeur" si la condition age >= 18est vraie et à "mineur"sinon.

Nous aurions pu écrire de façon équivalente :

def mineur_majeur(age):
if age >= 18:
    return "majeur"
else:
    return "mineur"

II. Le else

À vous de jouer 2

1. Tester les codes suivants écrits par Alice et Bob.

Code d'Alice :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Code de Bob

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

2. Que s'est-il passé ?

Solution
  • Dans la fonction majeur_v1 si la condition age >= 18 est vraie la valeur "majeur" est renvoyée, et sinon, comme on ne rencontre pas de return la valeur None est renvoyée.

  • Dans la fonction majeur_v2 il n'est pas renvoyé une expression comme l'a peut-être imaginé Bob. En effet, une expression doit toujours pouvoir être évaluée. Comme le message d'erreur le montre bien, il y a donc une erreur de syntaxe en ligne 2.

❤️ À retenir

Dans une expression conditionnelle la présence du else est obligatoire.

Pour que A if B else C soit valide, il faut que A, B et C soient des expressions.

❤️ Vocabulaire usuel

Une expression conditionnelle , bien que ce soit une expression, est très souvent appelée opérateur ternaire

III. Cas d'usages⚓︎

Utilisation comme valeur renvoyée par une fonction⚓︎

Dans une fonction

Comme nous l'avons vu précédemment, une fonction peut renvoyer une expression conditionnelle.

À vous de jouer 3

Exécuter et tester :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Utilisation comme valeur affectée à une variable⚓︎

À vous de jouer 4

Tester :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Que s'est-il passé ?

Dans cet exemple l'expression conditionnelle "majeur" if age >= 18 else "mineur"a été évaluée à "mineur"qui a ensuite été affecté à la variable categorie

À vous de jouer 5

Bob a écrit le code suivant qui est faux. Vous devez le corriger.

Aide

Pour que A if B else C soit valide, il faut que A, B et C soient des expressions.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013vt4=wf82pmuPj(è:51,cSsêrék63; dçg)/nqiyelRhb_CoaIL-050F0O0c0W0M0P0w0E0u0P0W0w0w0e010c0M0j010406050w0l0k0k0W0y0N040v0V0P0l0@0V0K0E020W0k0j0D0E0Q0O110y0L0l0O0w050J0~1012140|0j04051z1s1C0J1z0|0F0M0b0,0.0:0=0.0K0H0l0W0H0O0Z0j0N0c0R1b0E0R0M0H0R0P1(0R0c0`050%0S0P0O1L0/0;011%1)1+1)0c1;1?1/0c0y1A1Z0,170w0j0W0K0=0i011^1N010g0)0O0K1f0O1/2a2c2h1`2k1?2n0k2p040a0E0m0y0V0j0V0w0M1a1c0#280y0y0O0u2K1s2r0K1A0J1Z2W2426251:0F2t1O0M0K2m2H1/1I1K0-1_2*2,0K0V2:1/0j2P1A2U2W300}2b1c2=2i2_0y110P1/0W1$2P0g0=030T0T0u2`0O1+2^0V0Z0s3r0`0s1s0W31340{332s361`383a3c3e0O3g013i3k3m3o2-3r0Z2f040i3w3y2c3A2U2)013F0W3b1A3d0R3f3h3j3l0#3P2_3R0C0`0C3W2T3z0|3!3D0=3%3)053+3-3L3/3O2+3Q3s0d0`0d3{1t3z1D2~1s2:2Z0F262(40013:2z0!1J1A2}0O2 4i4h3Y054t4A2s0M0F0=3j2U3R0s3H4I4K3N3;4a3?3s4O0E2x0O4R4t3=3q4W1/0J3x3B351M1`0u4O04030E0U3m2N0y1(0z0E0q3|3Y0|4C2V4-0E4Q014L343R3T44574J594S3n4U4(3S2g4Z4#493p5c4*4,3 4/0=0A0`0#0g51555v2?010f0`0E5C4G4.5F0K0g0`0k4a0l0y0T110n0O5T5K564r0_040o5!5E370`1T0O5*343#5%0I50543A5_56585a2c3@4P5g484T5r3s3^4Y2o5p644b0Z3^2W3x0E6h5J5+3E0`0u0W0c0O0H0V4|5/5_6j5;4r0V0`0e5K6w3C5w010w3T021o0V0c0D5W5Y0y6J0l6L0D6C5#6F5y040M5B6v6W5N5-1U6V6k0=6z04020H6M6B6$6,015R3u0h6+6x6X0`3n0w6u306D5M2i6H0`6R6T5R2,5T7a6M6C753#4;0`4@0Y1(2,0E0k2`6!0M0z733}5:4H620T4M4c616a5j650Z4d682y7F4%3R4d6f046i7i4r6Y2P0c5T0K6}6E6(046n6p6r6t5K53320J4F4j4z4l4w1s0c4o7^2$2X0W1=7=0J4m1y5L3#2P0k0T0g0W0A0O0T0R6e1k1m1o1q4 5!1F3A1z0X0P0E89190E0x241@240p0+6o6p0K0@0g0t0,120E1#0W5T0(0c0E0j0l0E0z0u4|2P0E2M890G1#0z1o1J3(2m6p8k8m1H1J3#1P1R5.1W1Y1!1c1|1*1,1.4x4k7.327:3!5}7B5b0i3t3*5f7M5k3S3t7K4!5h4$9d984X3,3J3.5i7N9l5t847U5z3J7y761`5H7R9y3#5O5Q5S5U6O5Z5{6^5%5)9L6~7$5.9D5$0`5@7,9D954M985d3d959j5r9#5n699i5q3Q9+3I3K3M9)9:5m7Q7S6%2i6Y6!7!9z416)7w3Y7T6F6.6:6=a13#6`040s6|9P7#2i5%5^307-4i947A9!6d7E9.6b3?98675oav7G9_679n9?63aCaxat9{7S6i9}6l7%6o6q6s0Ma52Va75F6.6?74aO0=786/6K6M9J6Qa*6U6v0Eao4Daq4Ras7P5e9(9/aJ7JaAaH9r7I2gaF9p9^a~9t9|6^6Y71aV9u6Fal9Xai1c9Z970Z0raub19kbn9,7LaBb2bo9=b6a}3q98boaLaMaX5,aQ7)aTbebG1`aZac4ra(7f6N9HbSbi32a@5has0Bbp9qbrb#9g9c9*0Zb)b547b%b,b#bEbM5x0`7W7YbP6F0K6maR7*aUbW4B7:1F4k814w530#0%0)0w04.

IV. Ne pas confondre avec les écritures en compréhension⚓︎

Les listes en compréhension

La syntaxe utilisée pour les listes en compréhension peut rappeler celle de l'opérateur ternaire, mais correspond à une écriture de filtre. Dans ce cas-là le else est interdit.

À vous de jouer 6

Exécuter le code ci-dessous. Vous pouvez le modifier à votre idée pour réaliser différents essais.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier