En effet, suivant la valeur que prend telle ou telle variable, il est souvent nécessaire de faire exécuter au programme une suite différente d'instructions ...
D'où la nécessité de disposer d'instructions de test pour "aiguiller" le programme...
En Python, comme dans de très nombreux langages, un test se fait avec l'instruction if ( ='si' ).
1. Structure de l'instruction if
1.1. Test simple
if(condition):
Instruction 1
Instruction 2....
...qui peut se traduire par :
"SI la condition est VRAIE,
alors exécuter les instructions 1,2,..."
"SI la condition est VRAIE,
alors exécuter le bloc d'instructions 1,2,...
SINON, dans les autres cas ( donc, si la condition est fausse ),
exécuter le bloc d'instructions 3,4,..."
"SI la condition A est VRAIE,
alors exécuter le bloc d'instructions 1,2,...
SINON SI la condition B est VRAIE,
alors exécuter le bloc d'instructions 3,4,...
SINON, dans tous les autres cas ( donc, si aucune des conditions précédentes n'est vraie ),
exécuter le bloc d'instructions 5,6,..."
La (ou les) instruction(s) à exécuter selon la situation sont regroupées dans un même bloc logique.
Elles sont donc toutes indentées d'un retrait par rapport à l'instruction "parente" ( ici, les instructions if, elif ou else ) pour indiquer à Python qu'il s'agit du même bloc logique.
Plusieurs blocs elif ( = "else if" ) peuvent être placés les uns à la suite des autres, voire même imbriqués les uns dans les autres.
On peut ainsi écrire de très complexes tests en "imbriquant" plusieurs évaluations de condition, qui s'excluent mutuellement : le programme les évalue les unes après les autres, et dès qu'il en trouve une de vraie, exécute son bloc d'instructions et passe toutes les suivantes...
2. Condition à évaluer :
La condition est une expression booléenne plus ou moins complexe, à évaluer à l'aide d'opérateurs de comparaison, vus au chapitre précédent :
Opérateur
Signification
Commentaire
==
égal à
ATTENTION : il s'agit bien d'un DOUBLE SIGNE ÉGAL...
C'est une erreur classique de ne mettre qu'un seul égal, qui est l'instruction d'affectation ( qui est donc, elle, toujours vraie !!! )
!=
différent de
>
supérieur à
<
inférieur à
>=
supérieur ou égal à
<=
inférieur ou égal à
in
présent dans
C'est l'opérateur qui permet de tester l'appartenance d'un élément à un autre, par exemple un caractère particulier dans une chaîne, un élément dans un fichier ou une liste,...de manière générale, un élément dans une structure itérable.
not in
pas présent dans
C'est l'opérateur inverse, celui qui permet de tester l'absence d'un élément dans une structure itérable.
Exemples :
if( moyenne ==10):if( nombreEleve >35):if( numero !=12):if('a'in mot ):
2.1. Conditions multiples :
L'expression booléenne peut être plus complexe, permettant d'évaluer plusieurs conditions en même temps, en utilisant les opérateurs and ( ET ) et or ( OU ).
Exemples :
if( valeur1 >2)or( valeur2 !=10):"si valeur1 est supérieure à 2 OU valeur2 est différente de 10,....."if( monAge >=18)and( monAge <=65):"si monAge est supérieure ou égale à 18 ET inférieure ou égale à 65"
3. Exercices
3.1. Traduire les tests suivants en langage naturel :
if stock <=10:
reponse ="Stock faible !"
RÉPONSE
SI la valeur de la variable stock est inférieure ou égal à 10,
alors la valeur de la variable reponse est "Stock faible !".
SI la valeur de la variable moyenne est supérieure ou égale à 10 ET que la valeur de la variable exclus est différente de 0,
alors la valeur de la variable reponse est "Elève admis.".
SI la valeur de la variable score est inférieure ou égale à 10, alors la valeur de la variable reponse est "Petit joueur !",
SINON SI la valeur de la variable score est supérieure à 100 ET inférieure à 200, alors la valeur de la variable reponse est "Pas mal...",
SINON, dans tous les autres cas, la valeur de la variable reponse est "Champion !".
3.2. Le test suivant est-il judicieusement écrit ?
if nombre1 > nombre2 :
difference = nombre1 – nombre2
test =1elif nombre1 < nombre2 :
difference = nombre2 – nombre1
test =0elif nombre2 == nombre1 :
difference =0
RÉPONSE
Non : il n'y a que deux possibilités pour la condition ( nombre1 > nombre2 ou nombre1 < nombre2 ), tous les autres cas correspondant à nombre1 = nombre2.
La troisième évaluation n'est donc pas nécessaire, et peut être remplacée par un simple else :
if nombre1 > nombre2 :
difference = nombre1 – nombre2
test =1elif nombre1 < nombre2 :
difference = nombre2 – nombre1
test =0else:
difference =0
3.3. Que fait le programme suivant ?
if nombre !=0:if nombre <256:print("Valeur trop petite !")elif nombre >256:print("Valeur trop grande!")else:print('Parfait!')else:print('Tricheur!')
RÉPONSE
Bien observer l'indentation : il y a deux blocs logiques d'instructions, dont l'un est imbriqué dans l'autre.
Cet ensemble fonctionne ainsi :
une première condition sur la variable "nombre != 0" est évaluée
SI cette condition est vraie,... ...alors une deuxième condition sur nombre ( comparée à 256 ) est évaluée
SINON, si la première condition est fausse ( et indépendamment du résultat de la deuxième ! ),... ....alors afficher "Tricheur !"
4. QCM d'entraînement
Que s'affiche-t-il à la fin de l'exécution de chacun des scripts suivants ?
1.
a =3
b =3if( a >5or b !=3):
b =4else:
b =2print(b)
2.
a =2
b =0if( a <0):
b =1elif( a >0and a <5):
b =2else:
b =3print(b)
3.
a =7
b =12if( a <5):
b = b-4if( b >=10):
b = b+1print(b)
4.
a =2
b =5if( a >6):
b =10elif( a >8):
b =3print(b)
5.
a =10if( a <5):
a =20elif( a >1):
a =500elif( a >100):
a =1else:
a =0print(a)
6.
x =0if( x =3):
y =5else:
y =10print(y)
7.
a =4
b =5
c =10if( a ==4and b <5):if( c <20):
a +=3
b +=4elif( a ==4or b >=5):if( c <20):
a +=5
b +=3print(a,b)
5. Applications
Pour chacune des fonctions écrites, tester leur fonctionnement en écrivant une ou plusieurs instructions d'appel avec des arguments différents.
5.1. La plus petite des deux
Écrire une fonction plus_petite() qui demande de saisir 2 valeurs et qui renvoie la plus petite des 2 valeurs.
L'indice de masse corporelle (IMC) est une mesure basée sur deux données : la taille et le poids corporel.
La formule standard s’applique aux hommes et aux femmes d’âge adulte. La formule est simple : IMC = poids (kg) divisé par la taille (m) au carré.
Voici les différentes catégories d’IMC établies par les organismes officiels de santé:
Poids insuffisant = 18,5 ou moins
Poids normal = 18,5-24,9
Surpoids = 25-29,9
Obésité = 30 ou plus
Ecrire une fonction calcul_imc() qui :
prend comme paramètres une valeur de taille ( flottant ) et une valeur de poids ( entier )
renvoie une chaîne de caractère :"Poids insuffisant", "Poids normal", "Surpoids" ou "Obésité" selon la valeur de l'IMC calculé.
Compléter le script avec les instructions qui :
demande à l'utilisateur sa taille et son poids
appelle la fonction calcul_imc() avec ces arguments
prend comme paramètres une chaîne de caractères représentant un texte, et une autre ne contenant qu'un seul caractère
compte et renvoie le nombre de fois où le caractère apparaît dans le texte
Une exemple de ( long ) texte est donné dans la variable long_texte dans l'éditeur Python ci-dessous.
Ce type de traitement fait partie des calculs par accumulation, où on utilise une variable auxiliaire ( l'accumulateur ) que l'on incrémente à chaque fois que le
caractère recherché est trouvé dans le texte.
1
2
3
4
5
6
7
8
long_texte="Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos"
On rappelle qu'une année est bissextile si elle comporte 366 jours et pas 365. Le jour supplémentaire éventuel est le 28 février.
Les années bissextiles sont :
les années divisibles par 4 ET non divisibles par 100
OU les années divisibles par 400
Écrire une fonction qui prend comme paramètre une année, et qui renvoie un booléen True si celle-ci est ( ou était/sera ) bissextile, False sinon.
Pour tester le programme : 1900 n'était pas une année bissextile, 2000 et 2016 l'étaient. Et cette année ?
AIDE
Un nombre est divisible par un autre si ils sont multiples l'un de l'autre, c'est à dire si le reste de la division du premier par le deuxième est égal à 0.
en se souvenant qu'une expression booléenne s'évalue à True ou False, réécrire la fonction en une seule
ligne !
Il existe un algorithme qui permet de déterminer le jour de la semaine correspondant à une date donnée sous la forme : jour, mois , année entre le 1er janvier 1800 et le 31 décembre 2099.
Bien qu'apparemment complexe, il s'agit d'une simple suite d'évaluation de conditions sur les chiffres de cette date :
siecle ← les deux premiers chiffres de l'année
an ← les deux derniers chiffres de l'année
mois ← le mois
jour ← le jour
annee ← l'année
valeur ← an + quotient de la division entière de an par 4
si siecle vaut 18, rajouter 2 à valeur
sinon si siecle vaut 20, rajouter 6 à valeur.
si le mois est janvier et que l'année n'est pas bissextile, ajouter 1 à valeur
si le mois est février,
alors
si l'année est bissextile, ajouter 3 à valeur,
sinon ajouter 4 à valeur
si le mois est mars ou novembre, ajouter 4 à valeur
sinon si le mois est mai, ajouter 2 à valeur
sinon si le mois est juin, ajouter 5 à valeur
sinon si le mois est août, ajouter 3 à valeur
sinon si le mois est octobre, ajouter 1 à valeur
sinon si le mois est septembre ou décembre, ajouter 6 à valeur
( Noter qu'on n'ajoute rien à valeur pour avril et juillet...)
valeur = reste de la division entière de ( valeur + jour ) par 7
si valeur est égale à 1, le jour de cette date est dimanche
sinon si valeur est égale à 2, le jour de cette date est lundi
sinon si valeur est égale à 3, le jour de cette date est mardi
sinon si valeur est égale à 4, le jour de cette date est mercredi
sinon si valeur est égale à 5, le jour de cette date est jeudi
sinon si valeur est égale à 6, le jour de cette date est vendredi
sinon si valeur est égale à 0, le jour de cette date est samedi
Écrire une fonction jour_date() qui prend comme paramètres une date sous la forme requise par le programme ( siècle, an, mois et jour ), qui applique l'algorithme pour trouver le jour de la semaine
correspondant à cette date, et qui renvoie cette information.
Dans l'algorithme ci-dessus, on voit qu'il faut déterminer si l'année considérée est bissextile : pour cela, vous n'allez bien entendu pas réécrire le code de l'exercice précédent, mais
utiliser directement la fonctionest_bissextile() : en effet, on peut très bien appeler une fonction à l'intérieur de la définition d'une autre.
Dans votre script, vous aurez donc deux fonctions, et le programme principal.
Cette façon de faire apporte de la modularité à un programme, en attribuant une fonction à chaque tache particulière à réaliser, plutôt que de tout faire dans une seule ( et énorme ! ) fonction,
dont le code devient dès lors très compliqué à lire et très difficile à corriger !
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
defest_bissextile(annee):
# code repris de l'exercice précédent
pass
defjour_date(siecle,an,mois,jour):
# la fonction qui appellera au besoin la précédente