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

.128013jncIom/gS-d;fw,ê2qyL)çeéh43vRlrb_:èpCk65 i=(a8sP1tu050l0x0Y0T0Q0E0V0P0d0E0T0V0V0R010Y0Q0K010406050V0Z0g0g0T0F0t040j0f0E0Z0@0f0c0P020T0g0K0m0P0D0x110F0s0Z0x0V050h0~1012140|0K04051z1s1C0h1z0|0l0Q0C0,0.0:0=0.0c0i0Z0T0i0x0k0K0t0Y0z1b0P0z0Q0i0z0E1(0z0Y0`050%0G0E0x1L0/0;011%1)1+1)0Y1;1?1/0Y0F1A1Z0,170V0K0T0c0=0r011^1N010n0)0x0c1f0x1/2a2c2h1`2k1?2n0g2p040a0P0W0F0f0K0f0V0Q1a1c0#280F0F0x0d2K1s2r0c1A0h1Z2W2426251:0l2t1O0Q0c2m2H1/1I1K0-1_2*2,0c0f2:1/0K2P1A2U2W300}2b1c2=2i2_0F110E1/0T1$2P0n0=030H0H0d2`0x1+2^0f0k0X3r0`0X1s0T31340{332s361`383a3c3e0x3g013i3k3m3o2-3r0k2f040r3w3y2c3A2U2)013F0T3b1A3d0z3f3h3j3l0#3P2_3R0B0`0B3W2T3z0|3!3D0=3%3)053+3-3L3/3O2+3Q3s0A0`0A3{1t3z1D2~1s2:2Z0l262(40013:2z0!1J1A2}0x2 4i4h3Y054t4A2s0Q0l0=3j2U3R0X3H4I4K3N3;4a3?3s4O0P2x0x4R4t3=3q4W1/0h3x3B351M1`0d4O04030P0L3m2N0F1(0y0P0I3|3Y0|4C2V4-0P4Q014L343R3T44574J594S3n4U4(3S2g4Z4#493p5c4*4,3 4/0=0M0`0#0n51555v2?010o0`0P5C4G4.5F0c0n0`0g4a0Z0F0H110b0x5T5K564r0_040S5!5E370`1T0x5*343#5%0v50543A5_56585a2c3@4P5g484T5r3s3^4Y2o5p644b0k3^2W3x0P6h5J5+3E0`0d0T0Y0x0i0f4|5/5_6j5;4r0f0`0R5K6w3C5w010V3T021o0f0Y0m5W5Y0F6J0Z6L0m6C5#6F5y040Q5B6v6W5N5-1U6V6k0=6z04020i6M6B6$6,015R3u0U6+6x6X0`3n0V6u306D5M2i6H0`6R6T5R2,5T7a6M6C753#4;0`4@0u1(2,0P0g2`6!0Q0y733}5:4H620H4M4c616a5j650k4d682y7F4%3R4d6f046i7i4r6Y2P0Y5T0c6}6E6(046n6p6r6t5K53320h4F4j4z4l4w1s0Y4o7^2$2X0T1=7=0h4m1y5L3#2P0g0H0n0T0M0x0H0z6e1k1m1o1q4 5!1F3A1z0e0E0P89190P0q241@240J0+6o6p0c0@0n0p0,120P1#0T5T0(0Y0P0K0Z0P0y0d4|2P0P2M890w1#0y1o1J3(2m6p8k8m1H1J3#1P1R5.1W1Y1!1c1|1*1,1.4x4k7.327:3!5}7B5b0r3t3*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`040X6|9P7#2i5%5^307-4i947A9!6d7E9.6b3?98675oav7G9_679n9?63aCaxat9{7S6i9}6l7%6o6q6s0Qa52Va75F6.6?74aO0=786/6K6M9J6Qa*6U6v0Pao4Daq4Ras7P5e9(9/aJ7JaAaH9r7I2gaF9p9^a~9t9|6^6Y71aV9u6Fal9Xai1c9Z970k0Oaub19kbn9,7LaBb2bo9=b6a}3q98boaLaMaX5,aQ7)aTbebG1`aZac4ra(7f6N9HbSbi32a@5has0Nbp9qbrb#9g9c9*0kb)b547b%b,b#bEbM5x0`7W7YbP6F0c6maR7*aUbW4B7:1F4k814w530#0%0)0V04.

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