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

.128013Sço4lR5s_L6:wê/phPnI1gk2cCj=iè)-tfear3,(d8 vé;umbyq050P0J0H0K0D0f0i0R0z0f0K0i0i0C010H0D0q010406050i0V0W0W0K0L0Y040b0d0f0V0@0d0t0R020K0W0q0U0R0g0J110L0Z0V0J0i050p0~1012140|0q04051z1s1C0p1z0|0P0D0S0,0.0:0=0.0t0w0V0K0w0J0G0q0Y0H0r1b0R0r0D0w0r0f1(0r0H0`050%0X0f0J1L0/0;011%1)1+1)0H1;1?1/0H0L1A1Z0,170i0q0K0t0=0y011^1N010I0)0J0t1f0J1/2a2c2h1`2k1?2n0W2p040a0R0s0L0d0q0d0i0D1a1c0#280L0L0J0z2K1s2r0t1A0p1Z2W2426251:0P2t1O0D0t2m2H1/1I1K0-1_2*2,0t0d2:1/0q2P1A2U2W300}2b1c2=2i2_0L110f1/0K1$2P0I0=030j0j0z2`0J1+2^0d0G0v3r0`0v1s0K31340{332s361`383a3c3e0J3g013i3k3m3o2-3r0G2f040y3w3y2c3A2U2)013F0K3b1A3d0r3f3h3j3l0#3P2_3R0M0`0M3W2T3z0|3!3D0=3%3)053+3-3L3/3O2+3Q3s0e0`0e3{1t3z1D2~1s2:2Z0P262(40013:2z0!1J1A2}0J2 4i4h3Y054t4A2s0D0P0=3j2U3R0v3H4I4K3N3;4a3?3s4O0R2x0J4R4t3=3q4W1/0p3x3B351M1`0z4O04030R0A3m2N0L1(0T0R0m3|3Y0|4C2V4-0R4Q014L343R3T44574J594S3n4U4(3S2g4Z4#493p5c4*4,3 4/0=0x0`0#0I51555v2?010n0`0R5C4G4.5F0t0I0`0W4a0V0L0j110B0J5T5K564r0_040O5!5E370`1T0J5*343#5%0F50543A5_56585a2c3@4P5g484T5r3s3^4Y2o5p644b0G3^2W3x0R6h5J5+3E0`0z0K0H0J0w0d4|5/5_6j5;4r0d0`0C5K6w3C5w010i3T021o0d0H0U5W5Y0L6J0V6L0U6C5#6F5y040D5B6v6W5N5-1U6V6k0=6z04020w6M6B6$6,015R3u0Q6+6x6X0`3n0i6u306D5M2i6H0`6R6T5R2,5T7a6M6C753#4;0`4@0k1(2,0R0W2`6!0D0T733}5:4H620j4M4c616a5j650G4d682y7F4%3R4d6f046i7i4r6Y2P0H5T0t6}6E6(046n6p6r6t5K53320p4F4j4z4l4w1s0H4o7^2$2X0K1=7=0p4m1y5L3#2P0W0j0I0K0x0J0j0r6e1k1m1o1q4 5!1F3A1z0u0f0R89190R0o241@240E0+6o6p0t0@0I0N0,120R1#0K5T0(0H0R0q0V0R0T0z4|2P0R2M890c1#0T1o1J3(2m6p8k8m1H1J3#1P1R5.1W1Y1!1c1|1*1,1.4x4k7.327:3!5}7B5b0y3t3*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`040v6|9P7#2i5%5^307-4i947A9!6d7E9.6b3?98675oav7G9_679n9?63aCaxat9{7S6i9}6l7%6o6q6s0Da52Va75F6.6?74aO0=786/6K6M9J6Qa*6U6v0Rao4Daq4Ras7P5e9(9/aJ7JaAaH9r7I2gaF9p9^a~9t9|6^6Y71aV9u6Fal9Xai1c9Z970G0haub19kbn9,7LaBb2bo9=b6a}3q98boaLaMaX5,aQ7)aTbebG1`aZac4ra(7f6N9HbSbi32a@5has0lbp9qbrb#9g9c9*0Gb)b547b%b,b#bEbM5x0`7W7YbP6F0t6maR7*aUbW4B7:1F4k814w530#0%0)0i04.

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