Chapitre 1.2 - Instructions conditionnelles
I. La syntaxe par l'exempleâïž
Juste un if
Important
Prenez le temps de lire les commentaires !
Cliquez sur les +
- Le caractĂšre
:
est obligatoire aprĂšsif
,elif
,else
,for
etwhile
. Il provoque l'indentation automatique du bloc d'instruction qui suit.
Tester :
if et else
Important
Prenez le temps de lire les commentaires !
Cliquez sur les +
note = float(input("Saisir votre note : "))
if note >= 10: # (1)
print("reçu")
else: # (2)
print("refusé")
-
Le caractĂšre
:
est obligatoire aprĂšsif
,elif
,else
,for
etwhile
. Il provoque l'indentation automatique du bloc d'instruction qui suit. -
Le caractĂšre
:
est obligatoire aprĂšsif
,elif
,else
,for
etwhile
. Il provoque l'indentation automatique du bloc d'instruction qui suit.
Tester :
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
if, elif et else
Important
Prenez le temps de lire les commentaires !
Cliquez sur les +
note = float(input("Saisir votre note : "))
if note >= 16: # (1)
print("TB") # (2)
elif note >= 14: # (3)
print("B") # (4)
elif note >= 12: # (5)
print("AB") # (6)
elif note >= 10:
print("reçu") # (7)
else: # (8)
print("refusé") # (9)
-
Le caractĂšre
:
est obligatoire aprĂšsif
,elif
,else
,for
etwhile
. Il provoque l'indentation automatique du bloc d'instruction qui suit. -
Si on est arrivé là , cela signifie que
note
†16 -
elif
signifie sinon si. -
Si on est arrivé là , cela signifie que
note
< 16 etnote
â„ 14 :
14 â€note
< 16 -
Le caractĂšre
:
est obligatoire aprĂšsif
,elif
,else
,for
etwhile
. Il provoque l'indentation automatique du bloc d'instruction qui suit. -
Si on est arrivé là , cela signifie que
note
< 14 etnote
â„ 12 :
12 â€note
< 14 -
Si on est arrivé là , cela signifie que
note
< 12 etnote
â„ 10 :
10 â€note
< 12 -
Le caractĂšre
:
est obligatoire aprĂšsif
,elif
,else
,for
etwhile
. Il provoque l'indentation automatique du bloc d'instruction qui suit. -
Si on est arrivé là , cela signifie que
note
< 10 . On n'Ă©crit jamais de condition aprĂšselse
Tester :
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
if ... et if
Important
Prenez le temps de lire les commentaires !
Cliquez sur les +
note = float(input("Saisir votre note : "))
if note == 20: # (1)
print("Parfait !")
if note != 0: # (2)
print("Ce n'est pas nul !")
# (3)
-
Il faut deux symboles
==
pour tester l'égalité. Un seul symbole=
réalise une affectation. -
Différent s'écrit
!=
-
Il n'est pas obligatoire d'avoir un
else
Tester :
Vous pourrez tester les saisies de 0, puis de 20, puis de 10 par exemple. Que se passe-t-il ?
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Solution
Si on saisit 0 ... il ne se passe rien ...
Lisez le code, c'est normal ! đ
Si on saisit 20, "on rentre" dans les deux tests if
, et on obtient les deux affichages.
II. Cours/TD ifâïž
1. Avec des trianglesâïž
Le triangle est-il rectangle?
VoilĂ la question que l'on se pose : le triangle ci-dessous est-il rectangle ?
Tester ci-dessous. Que se passe-t-il ?
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Solution
Bien sûr ce code affiche que ABC est triangle, puisque 25 est bien égal a 9 + 16.
\(AC^2 == AB^2 + BC^2\) s'Ă©value Ă True
**Notez bien le ==
: Ce n'est pas une faute de frappe, on a vraiment mis deux fois le signe =.
đ En python :
- a = 1 est une affectation (a prend la valeur 1)
- a == 1 est une comparaison utilisant l'opérateur comparatif ==. Cet opérateur permet de tester une égalité : (ici la proposition est : a = 1 ?
-
a == 1 peut prendre deux valeurs : Vrai ou Faux. En Python (comme dans la majorité des langages de programmation) c'est True ou False. C'est donc une proposition booléenne.
-
On dénomme trÚs souvent les conditions ainsi : expressions booléennes.
La structure de cette instruction conditionnelle est :
Et si le triangle n'Ă©tait pas rectangle, qu'aurait fait notre programme ?
Essayons, en modifiant une longueur. Ci-dessous, on a mis BC = 2
, et du coup, forcément, l'égalité de pythagore n'est plus vraie, et le triangle n'est pas rectangle.
Tester ci-dessous. Que se passe-t-il ?
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Solution
Il ne se passe rien !
L'instruction print() n'a pas été exécutée, parce que la condition n'est pas vérifiée.
Cette fois, l'expression booléenne \(AC^2 == AB^2 + BC^2\) s'évalue à False
L'indentation
Afin de mieux visualiser le fonctionnement par bloc, nous allons ajouter quelques instructions dans notre code.
Tester ci-dessous. Que se passe-t-il ?
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Solution
đ On observe donc qu'il n'y a pas d'affichage dans le cas oĂč le triangle n'est pas rectangle en B.
2. Pile ou faceâïž
La fonction choice()
Dans cet exercice, nous allons utiliser : la fonction choice()
Cette fonction est disponible dans la librairie random
.
Nous aurons l'occasion de reparler de tout ceci plus tard.
Pour le moment nous allons juste utiliser le petit code suivant.
Vous devez l'exécuter plusieurs fois de suite.
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Jeu de Pile ou Face
Le jeu est le suivant :
On simule avec le code précédant le lancer de piÚce.
- Si on tombe sur
"pile"
on gagne 1 euro. - Si on tombe sur
"face"
on perd 1 euro.
Compléter le code ci-dessous pour qu'il s'affiche "gagné 1 euro" ou "perdu 1 euro" en respectant la rÚgle du jeu.
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Jeu de Pile ou Face avec deux lancers
Le jeu est maintenant le suivant
On simule avec le lancer deux piĂšces.
* Si les deux piĂšces tombent toutes les deux du mĂȘme cĂŽtĂ© on gagne 1 euro.
* Si une tombe sur "pile"
et l'autre sur "face"
on perd 1 euro.
Le symbole différent
Rappel : en Python le symbole \(\neq\) s'Ă©crit !=
Compléter le code ci-dessous pour qu'il s'affiche "gagné 1 euro" ou "perdu 1 euro" en respectant la rÚgle du jeu.
đ Vous devrez l'exĂ©cuter plusieurs fois de suite pour bien observer les diffĂ©rentes possibilitĂ©s.
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
III. Cours/TD if ... elseâïž
if...if
Dans les 2 exercices qui précÚdent, vous pouvez remarquer qu'on fait à chaque fois un test puis son contraire :
exercice 1 :
- On teste d'abord si on a obtenu
"pile"
. - On teste ensuite le contraire, Ă savoir, si on a obtenu
"face"
.
Pourtant, le premier test pourrait nous suffire : si oui, le second test echouera, et si non, le second test réussira.
En clair, soit la piĂšce tombe sur "pile", soit elle ne tombe pas sur "pile" et on n'a pas besoin de se poser deux fois la mĂȘme question !
exercice 2 :
- soit les 2 piĂšces tombent du mĂȘme cĂŽtĂ©
- soit elles ne tombent pas du mĂȘme cĂŽtĂ©.
LĂ encore, il semble inutile de se poser deux fois la mĂȘme question !
En fait, dans ces deux exercices, on test une condition et on affiche une chose si elle est True et une autre sinon.
if ...else
đNous pouvons simplifier le code de l'exercice 1 ainsi :
tester et comprendre
1. tester un lancer pile
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
2. tester un lancer face
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Solution
VoiĂ ce qu'il se passe :
Jeu de Pile ou Face avec deux lancers et un else
Le jeu est maintenant le suivant
On simule avec le lancer deux piĂšces.
* Si les deux piĂšces tombent toutes les deux du mĂȘme cĂŽtĂ© on gagne 1 euro.
* Si une tombe sur "pile"
et l'autre sur "face"
on perd 1 euro.
Contrainte
Utiliser obligatoirement else
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
IV. Cours/TD if ... elif...elseâïž
La struction if ... else ... que nous venons de voir est souvent utilisée, quand on doit faire quelques chose si une condition est vraie, et autre chose sinon (si elle est fausse donc !).
Mais il y a aussi de nombreuses situations oĂč on peut avoir plusieurs cas.
Encore des triangles
Reprenons le triangle du début, et considérons maintenant 2 triangles :
Tester ci-dessous. Qu'en pensez-vous ?
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Solution
Ce n'est pas satisfaisant !
Pour le triangle de droite, le code a bien trouvé qu'il n'est pas rectangle en B. Ce qui est vrai. Mais il serait préférable qu'il nous affiche que ce triangle est rectangle en C.
En fait, il y a 3 égalités à vérifier pour savoir si le triangle est rectangle :
- \(AB^2 == AC^2 + BC^2\) đ le tirangle est rectangle en \(C\)
- \(AC^2 == AB^2 + BC^2\) đ le tirangle est rectangle en \(B\)
- \(BC^2 == AB^2 + AC^2\) đ le tirangle est rectangle en \(A\)
Et si aucune des 3 conditions n'est vraie : le triangle n'est pas rectangle !
Tester ci-dessous. Nous avons utilisé elif
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Résumé
Le code est donc trĂšs explicite :
Si 1ere condition :
bloc si cette condition est vraie
Sinon si 2Ăšme condition :
bloc si cette condition est vraie
Sinon si 3Ăšme condition :
bloc si cette condition est vraie
Sinon : # <-- sinon ici signifie : si aucune des conditions qui précÚdent n'est vraie
bloc si toutes les conditions précédentes sont fausse
A savoir
- Il peut y avoir autant de elif qu'on a de cas Ă tester
- Le
else
est facultatif (parfois, on regarde plusieurs cas, mais si aucun n'est vrai, on ne fait rien et on n' a donc pas besoin deelse
) - une seule condition sera exécutée (celle qui est vraie ou celle du
else
, s'il y a unelse
) - MĂȘme si 2 conditions sont vraies ?
oui ! voir les exemples ci dessous...
Pile ou face avec conditions non mutuellement exclusives
Modifions le jeu : on lance 2 piÚces, et si au moins une des deux est pile on a gagné, sinon on a perdu.
Tester ci-dessous. Qu'en pensez-vous ?
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Solution
Nous sommes d'accord, les 2 conditions lancer_1 == "pile"
et lancer_2 == "pile"
sont vraies toutes les deux ...
mais si on a gagné à la 1ere piÚce, inutile de vérifier si on a encore gagné à la seconde !
đ Dans une structure if.. elif... else... on arrĂȘte les tests dĂšs qu'une des conditions est vraie.
-
Dans l'exemple des triangles les conditions sont mutuellement exclusives :
Un triangle ne peut pas ĂȘtre rectangle et A et en mĂȘme temps en B ou en C. Donc s'il est rectangle en A, inutile de regarder s'il est rectangle en B. DĂšs qu'un cas est vrai, on peut se passer de regarder les autres. -
dans l'exemple des lancers de piĂšces les conditions ne sont pas mutuellement exclusives :
En gĂ©nĂ©ral, on utilise les structures elif avec des cas disjoint, c'est Ă dire pour des conditions mutuellement exclusives, ou pour le dire plus simplement, quand il est impossible que 2 conditions soient vraies en mĂȘme temps. Mais ce n'est pas obligĂ©, l'exemple des 2 piĂšces montre un tel exemple.
III. Exercicesâïž
Exercice 1 : la cible - version 1
Bob a trouvé un jeu de fléchette trÚs simple : il lance une flechette sur le plateau et il gagne 1 point si la flechette atteint la croix rouge. Le plateau est représenté ci-dessous :
Bob a programmé le jeu sur son ordinateur.
Dans cet exercice, nous allons utiliser une nouvelle fonction : la fonction randint()
Cette fonction permet d'obtenir un nombre aléatoire. Par exemple, randint(1, 6) est un nombre aléatoire compris entre 1 et 6, inclus.
Pour importer la fonction randint()
de la librairie random
(c'est-a-dire pouvoir l'utiliser dans notre code) nous ajoutons au début de notre code :
1. Compléter le code ci-dessous :
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Solution
# On importe la fonction randint du module random
from random import randint
# Bob lance sa flechette, elle atteint une case au hasard du plateau :
numero_ligne = randint(0, 4)
numero_colonne = randint(0, 4)
print("La flechette atteint la case située : Ligne :", numero_ligne,"et Colonne :", numero_colonne)
# a-t-il gagné ?
if numero_ligne == 2 :
print("Bob a gagné")
elif numero_colonne == 2 :
print("Bob a gagné")
else :
print("Bob Ă perdu")
2. Si la condition numero_ligne == 2
est vérifiée, est ce que la seconde condition, numero_colonne == 2
peut aussi ĂȘtre vĂ©rifiĂ©e ?
Solution
Oui, s'il atteint la case (2, 2) les 2 conditions seront vérifiées. (ici les conditions ne sont pas mutuellement exclusives)
3. Est-ce que le programme donne toujours le bon résultat ?
Solution
Le programme donne toujours le bon résultat :
- Lorsque la 1Úre condition est vérifiée, il est inutile de vérifier la 2Úme condition, car de toutes façons, il a gagné.
- Si la 1Úre n'est pas vérifiée, mais la deuxiÚme oui, il a aussi gagné.
- Si aucune des deux n'est vérifiée, alors il a perdu.
4. Alice propose un autre code :
if numero_ligne == 2 :
print("Bob a gagné")
if numero_colonne == 2 :
print("Bob a gagné")
if numero_ligne != 2 and numero_colonne != 2 :
print("Bob a perdu")
Solution
Le code d'Alice fonctionne aussi bien que le code de Bob. Toutefois :
- Il faudra toujours évaluer 3 expressions booléennes
- Tandis que le code de Bob n'en évalue qu'une si on a joué la ligne 2, et deux sinon.
En terme de lisibilité, le code d'Alice est plus difficile à lire.
Exercice 2 : la cible - version 2
Bob modifié les rÚgles du jeu. Voyez le nouveau plateau de jeu ci-dessous. La case rouge rapporte 100 points, les cases orange rapportent 50 points, les cases blanches ne rapportent aucun point.
Complétez ci-dessous pour que le code affiche le nombre de points gagnés
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Solution
from random import randint
# Bob lance sa flechette, elle atteint une case au hasard du plateau :
numero_ligne = randint(0, 4)
numero_colonne = randint(0, 4)
print("La flechette atteint la case située : Ligne :", numero_ligne,"et Colonne :",numero_colonne)
if numero_ligne == 2 and numero_colonne == 2:
print("100 points")
elif numero_ligne == 2 or numero_colonne == 2:
print("50 points")
else :
print("0 points")
IV. Bilanâïž
Attention Ă ne pas oublier les deux points et l'indentation.
La syntaxe de if :
đ Attention, l'instructions else
n'est pas du tout obligatoire (Voir les exemples ci-dessus).
-
Avec seulement
if
-
Avec
if
etelse
La syntaxe de if ... elif ... else :
đ Attention, l'instructions else
n'est pas du tout obligatoire (Voir les exemples ci-dessus).
-
Avec seulement
if
etelif
-
Avec
if
...elif
...else
V. Exercicesâïž
Exercice 1 papier
Que vaut la valeur finale de b ?
- 13
- 9
- 19
- 23
-
13Faux car 10 > 5. La ligne 4 et donc exécutée. - 9
-
19 -
23Faux car Ă la ligne 4 on a une nouvelle affectation de b qui ne respecte plus la condition du if de la ligne 5.
Exercice 2 'papier'
Que vaut la valeur finale de b ?
- 22
- 21
- 13
- 14
- 22
-
21Faux car la ligne 4 n'est pas exécutée -
13Faux car la ligne 4 n'est pas exécutée -
14Faux car à la ligne 6 est exécutée
Exercice 3 'papier'
Que vaut la valeur finale de b ?
- 24
- 17
- 20
- 27
- 24
-
17Faux car la ligne 6 est aussi exécutée -
20Faux car la ligne 4 et la ligne 6 sont exécutées. -
27Faux car à la ligne 4 est exécutée
Exercice 4 'papier'
Python | |
---|---|
Que vaut la valeur finale de a
?
- 3
- 16
- 1
- 12
- 3
-
16Faux car la ligne 6 n'est pas exécutée. -
1Faux car la ligne 10 n'est pas exécutée. -
12Faux car on cherche la valeur finale de a.
Exercice 5 'papier'
Python | |
---|---|
Que vaut la valeur finale de a
?
- -10
- -6
- 0
- -12
-
-10La ligne 6 est exécutée, mais on demande a. - -6. La ligne 6 et la ligne 10 sont exécutée. On demande a.
-
0Faux car la ligne 8 n'est pas exécutée. -
-12
Exercice 6 'papier'
Python | |
---|---|
Que vaut la valeur finale de a
?
- 10
- -8
- 18
- -6
-
-10 -
-8. La ligne 10 n'est pas exécutée. -
18Faux car la ligne 6 est exécutée mais on demande a. - -6. La ligne 6 et la ligne 8 sont exécutées. On demande a.
Exercice 7 'papier'
Python | |
---|---|
Que vaut la valeur finale de a
?
- -8
- 7
- -14
- 13
-
-8 - 7 . Les lignes 4 et 10 sont exécutées.
-
-14Faux car la ligne 4 est exécutée mais on demande a. -
13Faux car la ligne 8 n'est pas exécutée.
Exercice 8 'papier'
Que vaut la valeur finale de d
?
Solution
-2
# Tests
(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)