Accueil » Leçon 2 - Les structures conditionnelles

Leçon 2 - Les structures conditionnelles

Objectifs de la leçon :

Cette leçon est centrée sur l'utilisation des structures conditionnelles, il va s'agir d'exécuter des actions en fonction d'une ou plusieurs conditions.

Au passage, on va découvrir la notion de bloc d'instructions.

Pré-requis :

La leçon 1 : afficher, saisir, les variables, les calculs.

 

Des exemples pour démarrer

Dans cette leçon, on réalise des instructions conditionnelles, c'est à dire qu'on met en oeuvre un contrôle du type Si ... Alors... Sinon.

Vérifier la valeur d'une variable

On imagine que l'utilisateur de notre programme a saisi son âge dans un formulaire, et sa saisie a été stockée dans la variable MON_AGE.

Exemple : Une condition simple

Notre « if » va vérifier si MON_AGE est supérieur à 18, et afficher un message le cas échéant.


Exemple : Une condition simple - non remplie

Même code que l'exemple précédent, sauf que la valeur de MON_AGE est inférieure à 18, la condition du test réalisé par notre « if » n'étant pas remplie il ne se passera rien.



Pourquoi le « print() » est décalé par rapport au « if » ?

On appelle ce décalage une « indentation », et vous venez de découvrir le principe de « bloc d'instructions ».

Un bloc d'instructions est constitué :
-> d'un en-tête avec le mot-réservé if, de la condition à vérifier, et « : » pour terminer.
-> des instructions du bloc qui sont indentées par rapport à l'en-tête

Schéma :
en-tête :
instruction 1
instruction 2
...
instruction n
-
Le guide de style Python veut que cette indentation soit de 4 espaces.


Cette fois-ci on va fournir une alternative à notre vérification.

Exemple : Une condition avec une alternative

Ici MON_AGE = 4. Comme le prédicat « MON_AGE > 18 » n'est pas « VRAI », le bloc d'instruction du « else » sera exécuté par défaut.


Plutôt qu'une seule alternative à deux possibilités, il est possible de choisir entre plus de deux possibilités en rajoutant des « elif ».

Exemple : Plusieurs possibilités

Remarquez que pour tester que MON_AGE vaut 18, on utilise == et non pas =:
if MON_AGE == 18
Le = est réservé à l'affectation, le == est réservé au test d'égalité.

L'ESSENTIEL AVEC DES EXEMPLES DE BASE


Les structures conditionnelles.

Les structures conditionnelles sont utilisées en programmation lorsqu'on souhaite effectuer une ou plusieurs instructions seulement si une condition est vérifiée.

Effectuer un test simple :

Un if permet d'exécuter une action si une condition est remplie.

Exemple : Assez d'argent ?

Dans cet exemple, on connaît :
  • le prix unitaire d'un article ;
  • le nombre d'articles qu'on veut acheter ;
  • la somme qu'a l'utilisateur dans son porte-monnaie.

Le programme calcule le prix total pour tous les articles, puis compare au montant du porte monnaie et indique à l'utilisateur s'il peut acheter les articles et combien il lui restera.



Effectuer un test et réaliser une action si la condition n'est pas remplie :

Exemple : Assez d'argent ou pas ?

On reprend l'exemple précédent mais on augmente le nombre d'articles, ce qui fait que l'utilisateur ne peut plus acheter. Grâce au else, le programme indique à l'utilisateur qu'il ne peut acheter la totalité des articles et combien il lui manque.



Gérer plus de deux possibilités : 

Exemple : Quelle mention ?

Si la situation présente plus de deux possibilités, on dispose de elif qui permet d'intégrer des sous-conditions.
C'est le cas de cet exemple qui affiche la mention obtenue à un examen en fonction de la moyenne.


Un résumé sur la syntaxe des structures conditionnelles :

if simple :
if condition:
instruction 1
instruction 2
...
instruction n


if else :
if condition:
instruction 1
instruction 2
...
instruction n
else :
instruction 1
instruction 2
...
instruction n


if elif elif ... else : (autant d'elif qu'on veut)
if condition:
instruction 1
instruction 2
...
instruction n
elif condition:
instruction 1
instruction 2
...
instruction n
elif condition:
instruction 1
instruction 2
...
instruction n
elif condition:
instruction 1
instruction 2
...
instruction n
else:
instruction 1
instruction 2
...
instruction n
 
Pour constituer un bloc d'instructions, il faut un en-tête suivi d'instructions décalées par rapport à l'en-tête :
  • Dans le cas du if, l'en-tête est constitué du mot-réservé if, de la condition à vérifier, et « : » pour terminer.
  • Les instructions du bloc sont indentées par rapport à l'en-tête


Le guide de style Python veut que cette indentation soit de 4 espaces.

 


Les opérateurs de comparaison

 

Tableau listant les différents opérateurs de comparaison existants :
|    Condition          |   Opérateur   |
|-----------------------|---------------|
| Égal | == |
| Différent | != |
| Strictement supérieur | > |
| Strictement inférieur | < |
| Supérieur ou égal | >= |
| Inférieur ou égal | <= |

 


 

Prédicats multiples, utilisation des connecteurs logiques ET, OU et NON

Le ET logique

Pour vérifier que deux conditions sont simultanément réalisées, on dispose du ET logique qui s'écrit and :

Exemple : Pour monter sur le manège.

Pour monter sur le manège, il faut avoir plus de 11 ans et peser au moins 45 kg.


Le OU logique

Pour vérifier que sur deux conditions, une au moins est réalisée, on dispose du OU logique qui s'écrit or :

Exemple : Pour passer sous le tunnel.

Pour passer sous un tunnel, le véhicule doit être un autocar ou un véhicule particulier.


La négation

Parfois, il est plus facile de prendre la négation d'une condition, on dispose pour cela de l'opérateur not :

Exemple : Recevoir une allocation

Pour recevoir une certaine allocation, il faut être retraité, ou demandeur d'emploi ou étudiant. A quelle condition ne la reçoit-on pas ?


Grouper des conditions avec des parenthèses :

Il est possible de grouper des conditions avec des parenthèses. :

Exemple : Fashion victim

Pour être à la mode, le pantalon doit être blanc ou noir et la chemise d'une couleur différente de celle du pantalon.

Quelques exemples plus poussés

Exemple : Avez-vous suffisament d'argent ?

Dans cet exemple, on calcule le prix TTC d'un article à partir de son prix HT puis on le compare à la somme dont dispose l'utilisateur.
S'il a assez, on lui dit qu'il peut acheter l'article et ce qui lui restera.
Dans le cas contraire, on lui dit qu'il ne peut pas acheter et on indique ce qui lui manque.



Exemple : Gentilé....

Dis-moi où tu habites, je te dirai qui tu es... Au sujet du Gentilé...



Exemple : Nature d'un caractère

Le programme génère un nombre aléatoire carac compris entre 0 et 255 puis affiche la nature du caractère de code ASCII carac? Ce peut être :
  • ni une lettre, ni un chiffre ;
  • une voyelle minuscule ;
  • une console minuscule ;
  • une voyelle majuscule ;
  • une console majuscule ;
  • un chiffre.

Indication : vous aurez peut-être besoin de lire ceci.
Faites tourner de nombreuses fois le programme pour essayer d'obtenir les 6 cas de figure.

Les variables de cet exemple :
carac # le code ASCII du caractère aléatoire généré par la fonction
chr(carac) # le caractère lui-même
# par exemple, si carac = 67, chr(carac) = "C"
ord("A") # le code ASCII de "A", c'est 65.

Comme vous pourrez le constater, il y a de nombreux caractères "non imprimables", c'est à dire qu'un print de ces caractères n'affiche rien.

 

Des pièges à éviter


Utiliser un = au lieu de == pour tester une égalité

Exemple : affectation n

Le = est réservé à l'affectation, le == est réservé au test d'égalité.
Si on se trompe, ça bugue !!!



Faire la confusion entre < et <=

Exemple : If au faciès

Lorsqu'on cherche à savoir si nombre est « inférieur à » ou « supérieur à », il faut penser à adapter son prédicat en fonction de l'utilisation d'un test exclusif (< et >) ou inclusif (<= et >=).
Analysez bien le code suivant et comprenez ce qu'il se passe.



Faire un ensemble de tests liés, avec uniquement des if

Exemple : Mauvaise utilisation d'une suite de if

Qaund on a 9 ans, les 3 conditions sont vraies donc on se répète.
Il aurait fallu des elif



Croire qu'un else peut être le sinon de plusieurs si...

Exemple : Mauvaise utilisation de else avec une suite de if

Un else est le sinon de l'unique if au-dessus de lui qui n'a pas d'else et qui est indenté de la même façon.
Ici le else est le sinon de :
if note >= 15 and note < 18:
Donc notre élève est refusé avec la mention excellence, c'est la classe !

Là aussi, il aurait fallu des elif pour résoudre notre problème.

Bon à savoir


else et elif sont optionnels

Exemple : Ni else, ni elif

Un programme sans else, ni elif.


Factoriser du code

Exemple : Factoriser du code

Si deux instructions identiques se trouvent à la fois dans un bloc if et dans son bloc else correspondant alors il y a de fortes chances pour que cette instruction puissent être sortie du bloc if et else et bien sur écrite à part :

Dans le code plus bas signalé par "code à améliorer", l'instruction :
print(\'x =\',x,\'et y =\',y )
aurait gagné à être supprimée des deux blocs et être écrite après le else puisqu’elle est exécutée dans les deux cas. On aurait dû écrire ceci :

x = 8

if x < 10:
y = 3*x
else:
y = 2*x - 5

print('x =',x,'et y =',y )
 


Les lois de Morgan

Exemple : Lois de Morgan

Les lois de Morgan disent quelles sont les négations d'un Ou et d'un ET
Plus précisément :
  • Non (A OU B) = (Non A) ET (Non B)
  • Non (A ET B) = (Non A) OU (Non B)

 


Faire du debuggage avec les exceptions

Lorsque votre programme doit interagir avec l'utilisateur, plutôt que d'envisager tous les cas possibles et imaginables et de le prévoir dans des if/elif, vous pouvez utiliser les exceptions, c'est très recommandé.

Grossièrement, les exceptions permettent d'intercepter les erreurs dans l'exécution de votre programme, et d'exécuter une action ou afficher un message en fonction de ces erreurs. Très pratique.

Le quizz

Exercice à choix multiple : Simple if
Qu'est-ce que va afficher :
age = 23
if age < 18:
print('Bonjour')
Correct !

Exercice à choix multiple : Simple if bis
Qu'est-ce que va afficher :
age = 18
if age < 18:
print('Bonjour')
else:
print('Au revoir')
Correct ! En effet, il s'agit d'une comparaison stricte, donc 18 est exclu.

Exercice à choix multiple : Simple if ter
Qu'est-ce que va afficher :
age = 18
if age <= 18:
print('Bonjour')
else:
print('Au revoir')
Correct ! En effet, il s'agit d'une comparaison large, donc 18 est inclus.

Exercice à réponse courte : Syntaxe
Quelle est la bonne syntaxe ? Le code A, B ou C ?
##### Code A
note = 9
if note < 10:
print('Refusé')
elif note >= 10 and note < 15:
print('Mention Bien')
elif note >= 15 and note < 18:
print('Mention Très Bien')
else note >= 18 :
print('Mention Excellence')

##### Code B
note = 9
if note < 10:
print('Refusé')
elif note >= 10 and note < 15:
print('Mention Bien')
elif note >= 15 and note < 18:
print('Mention Très Bien')
else:
print('Mention Excellence')

##### Code C
note = 9
if note < 10:
print('Refusé')
elif note >= 10 and note < 15:
print('Mention Bien')
elif note >= 15 and note < 18:
print('Mention Très Bien')
else:
print('Mention Excellence')
Correct !

Exercice à choix multiple : Calcul conditionnel
x = 4

if x > 8:
x = x + 12

if x >= 0 and x <= 10:
x = x - (x + 2)
Combien vaut x à la fin du programme ?
Correct !

Exercice à choix multiple : Calcul conditionnel
x = 6
if x > 4:
x = x + 12

if x >= 10 and x <= 20:
x = x - (x + 2)
else:
x += 5
Combien vaut x à la fin du programme ?
Correct !

Exercice à choix multiple : Calcul conditionnel
x = 6
y = 5
if x*y > 30 or x+y <= 11:
x += 10

if x >= 10 and x <= 20:
y -= 3
else:
x += 5
print (x+y)
Qu'est-ce qu'affiche ce programme ?
Correct !

Exercice mêlé : TVA conditionnelle
Ordonnez les lignes de code suivantes pour appliquer une TVA de 5,5% sur les biens, et 20% sur les services. L'assignation du prix ht se fait à la première ligne.
  • taux_tva = 20
  • if type_achat == 'service':
  • taux_tva = 5.5
  • type_achat = 'bien'
  • elif type_achat == 'bien':
  • prix_ttc = prix_ht + (prix_ht * taux_tva / 100)
  • prix_ht = 40
  • print(prix_ttc)
Correct !

Exercice mêlé : Indentation
À partir de l'indentation des instructions, retrouver l'ordre de celles-ci.
  • print('L')
  • print('o')
  • if True:
  • print('L')
  • if True:
  • print('H')
  • if True:
  • print('E')
  • if True:
  • if True:
Correct !

Questions souvent posées


Est-il possible de tester plusieurs conditions en même temps ?

Bien sûr ! Dans le cas où vous souhaitez tester plusieurs conditions en même temps il faut séparer les conditions par un connecteur logique (« and » ou « or »).

if (x >= a) and (x <= b):



Est-ce qu'un else peut aller avec plusieurs if ?

Non, un else est systématiquement attaché au seul if au-dessus de lui qui n'a pas de else et dont l'indentation correspond.

Si vous voulez construire un ensemble de if avec un else pour une action alternative par défaut, vous devriez peut-être réfléchir à l'utilisation de elif.

Pour faire ce test :

Exemple : Mauvaise utilisation de else avec une suite de if

Le else n'est relié qu'au dernier if, donc en sortie on aura « Refusé » car 9 est plus petit que 10. Mais également « Mention Excellence » car 9 n'est pas compris dans l'intervalle [15, 18[.

On écrira donc plutôt :

Exemple : Solution



Est-on obligé de mettre un else ?

Non, le else est optionnel.



Comment tester qu'une variable se trouve dans un intervalle ?

Si x est un entier, alors pour tester que x est compris dans l'intervalle [a , b] il faut écrire (les parenthèse ne sont pas obligatoires, mais permette une meilleure distinction des blocs) :

if (x >= a) and (x <= b):
Si x est un entier, alors pour tester que x n'est pas compris dans l'intervalle [a , b] il faut écrire :

if (x < a) or (x > b):
Il est également possible d'inverser le test avec l'utilisation de « not », toutefois le code perd en lisibilité et simplicité (ici les parenthèse sont nécessaires si on veut que le not inverse l'ensemble du test) :

if not (x >= a and x <= b):



Comment utiliser la constante mathématique pi dans un programme ?

En tête de code :

from math import pi as PI
Cela inclut la constant pi du module math et dans votre programme, elle s'appelle PI.

Exemples de questions de cours

  • Quelle est la syntaxe de l'alternative (if … elif … else) ?
  • Qu'est-ce que l'indentation ?
  • Quels sont les opérateurs de comparaison ?
  • Qu'est-ce que fait l'opérateur « not » ?
  • Quels sont les connecteurs logiques ?
  • Quelle est la différence entre = et == ?

Des exercices pour s'entraîner

Exercice de code : Mineur ou majeur

Ecrire un programme qui attend l'âge de l'utilisateur et qui affiche un message lui redonnant son âge et lui indiquant qu'il est mineur ou majeur.
On entrera l'âge de l'utilisateur (un entier) et on affichera le message au format suivant :
Vous avez 56 ans. Vous êtes majeur.
ou
Vous avez 9 ans. Vous êtes mineur.
 
Vous pouvez entrer des données pour le programme dans la boîte ci-dessous.

Exercice de code : Un peu de géométrie

Ecrire un programme qui calcule l'aire de différentes figures : disque, triangle, rectangle.
Le programme attend le choix de l'utilisateur :
  • 1 pour disque
  • 2 pour triangle
  • 3 pour rectangle

Puis, selon le choix, le programme attend les données nécessaires (ce sont des float) :

Enfin le programme affiche l'aire au format suivant :
 

Aire du disque = 102.07034531513239
ou
Aire du triangle = 38.13
ou
Aire du rectangle = 39.0
 
Vous pouvez entrer des données pour le programme dans la boîte ci-dessous.

 

Exercice de code : Changement de casse

Ecrire un programme qui attend un caractère. Si le caractère est une lettre, on inverse sa casse. Si ce n'est pas une lettre, on laisse le caractère inchangé.
On entrera le caractère et on affichera le message de sortie au format suivant, selon les 3 cas de figure :
 
Vous avez saisi la lettre majuscule U.
Après transformation en minuscule, on obtient la lettre u.
ou
Vous avez saisi la lettre minuscule b.
Après transformation en majuscule, on obtient la lettre B.
ou
Vous avez saisi le caractère @, ce n'est pas une lettre.
 
Indication : vous aurez peut-être besoin de lire ceci et ceci aussi ;-)

Vous pouvez entrer des données pour le programme dans la boîte ci-dessous.

Exercice de code : Location de voitures

Un organisme de location de voitures propose à ses clients 2 tarifs :
  • tarif essence :
    • location : 40 Euros / jour
    • kilométrage : 15 cts / km

  • tarif diesel :
    • location : 50 Euros / jour
    • kilométrage : 10 cts / km

On entrera dans cet ordre la distance à parcourir et la durée de la location. Ce sont deux entiers.
Puis le programme produira un état de sortie détaillé indiquant le meilleur choix, au format suivant :
 

Pour 10 jours et 1540 km
avec un véhicule à essence : 631.0
avec un véhicule diesel : 654.0
Véhicule à essence conseillé
ou
Pour 1 jours et 437 km
avec un véhicule à essence : 105.55
avec un véhicule diesel : 93.7
Véhicule diesel conseillé
ou
Pour 4 jours et 800 km
avec un véhicule à essence : 280.0
avec un véhicule diesel : 280.0
Véhicule diesel et essence au même prix
 
Vous pouvez entrer des données pour le programme dans la boîte ci-dessous.

Exercice de code : Assurance auto

Une compagnie d'assurances pratique la méthode de la franchise variable :
La franchise est égale à 10 % du montant total des réparations avec un minimum de 150 € et sans pouvoir dépasser 450 €.

Exemples :

AssuranceAuto

Le programme attend le montant total des réparations (un float), puis affiche la franchise payée par l'assuré et le remboursement effectué par l'assurance au format suivant :
 

Montant des réparations : 3425.1
Franchise assuré : 342.51
Remboursement assureur : 3082.59
Vous pouvez entrer des données pour le programme dans la boîte ci-dessous.

Un résumé produit par des étudiants

Pas de résumé disponible pour l'instant. Mais vous pouvez le faire !

Vous en verrez d'autres dans les leçons suivantes comme def, for, while
MON_AGE > 18
Un prédicat est une expression incomplète du type « […] est un homme », « […] est plus petit que […] », qui devient une proposition si on la complète par un ou plusieurs noms d’objet. Cette proposition est évaluée comme VRAIE ou FAUSSE. En Python, un prédicat retournera True (vrai) ou False (faux).
qui signifie else if : sinon, si...
Raccourci pour else if (sinon si...)
Vous en verrez d'autres dans les leçons suivantes comme def, for, while
MON_AGE > 18
C'est un OU inclusif. Les deux conditions peuvent être réalisées simultanément
Le prix toutes taxes comprises : PTTC = PHT + PHT*TauxTVA/100
Prix hors taxes
moins de 18 ans
18 ans et plus
aire disque = pi * rayon ^2
aire triangle = base * hauteur / 2
aire rectangle = longueur * largeur
Si, c'est une minuscule, on la transforme en majuscule et vice-versa