Vidéo 16 : L’instruction if¶
Instruction if
¶
L’instruction if
permet de coder un schéma logique du type
si … alors …
Illustration¶
On veut coder un programme qui :
définit une variable
x
référant un entier,affiche la valeur de
x
,teste si
x
est strictement négatif et, si c’est le cas, affiche :- le message : x est négatif,
- l’opposé de
x
(c’est-à-dire-x
),
se termine en affichant le message Fin du programme.
Voilà ce que pourrait afficher le programme si la variable x
dans le code-source vaut 10
:
-10
x est négatif
10
Fin du programme
Le programme sera intitulé instruction_if.py
.
Implémentation en Python¶
Le programme instruction_if.py
doit afficher un message et un nombre si une certaine condition est vérifiée. Pour cela, en Python, on utilise
- une instruction
if
pour exprimer l’idée de condition si … alors … - un booléen pour exprimer la condition si.
Le problème posé admet la solution suivante :
instruction_if1.py
1 2 3 4 5 6 7 8 | x = -10
print(x)
if x < 0:
print("x est négatif")
print(-x)
print("Fin du programme")
|
9 10 11 12 | -10
x est négatif
10
Fin du programme
|
Examinons maintenant le même code que instruction_if1.py
où on a remplacé x = -10
par x = 42
en ligne 1 :
instruction_if2.py
1 2 3 4 5 6 7 8 | x = 42
print(x)
if x < 0:
print("x est négatif")
print(-x)
print("Fin du programme")
|
9 10 | 42
Fin du programme
|
L’édition d’une instruction if
¶
On reprend le code ci-dessus :
instruction_if1.py
1 2 3 4 5 6 7 8 | x = -10
print(x)
if x < 0:
print("x est négatif")
print(-x)
print("Fin du programme")
|
Lignes 4-6 : une instruction conditionnelle. Elle utilise le mot-clé
if
.Ligne 4 : la condition testée est
x < 0
. Cette condition est toujours suivie du séparateur:
(deux-points). La ligne qui s’étend du mot-cléif
jusqu’au séparateur s’appelle l”en-tête de l’instructionif
.Lignes 5-6 : le corps de l’instruction
if
est le bloc situé aux lignes 5 et 6. Ce corps, la plupart du temps :- commence sous l’en-tête (il faut donc sauter une ligne) ;
- est indenté par rapport à l’en-tête.
Exécution d’une instruction if
¶
On reprend les codes ci-dessus :
instruction_if1.py
1 2 3 4 5 6 7 8 | x = -10
print(x)
if x < 0:
print("x est négatif")
print(-x)
print("Fin du programme")
|
ainsi que
instruction_if2.py
1 2 3 4 5 6 7 8 | x = 42
print(x)
if x < 0:
print("x est négatif")
print(-x)
print("Fin du programme")
|
Ligne 1 : très souvent, la condition de l’instruction
if
dépend d’une variable définie avant l’instructionif
. Ici, la variable s’appellex
.Ligne 4 : lorsque l’exécution du code arrive face à une condition
if
, la conditionif
est testée : vaut-elleTrue
? vaut-elleFalse
?Lignes 5-6 :
- si la condition vaut
True
(cf.instruction_if1.py
), les instructions du corps deif
sont exécutées - si la condition vaut
False
(cf.instruction_if2.py
), les instructions du corps deif
sont ignorées et l’exécution passe directement à la suite du code (ligne 8)
- si la condition vaut
Ligne 8 : Une fois l’instruction
if
exécutée, l’exécution continue normalement.
Indentation intelligente des éditeurs¶
L’indentation d’une ligne code est marquée par un décalage vertical par rapport à la marge.
Dans la plupart des éditeurs, l’indentation est intelligente et constante :
- intelligente car l’éditeur, en fonction de la présence du séparateur deux-points en fin de ligne, sait s’il doit, ou non, indenter la ligne suivante
- constante car chaque passage à la ligne dans un bloc fait commencer la ligne à la même indentation que la précédente.
Soit le code suivant :
1 2 3 4 5 6 7 | x = -100
if x < 0:
print("x est negatif")
print(-x)
print "Fin du programme"
|
- Lignes 1 et 3 : pas d’indentation.
- Ligne 4 : le début de ligne est indenté automatiquement.
- Ligne 5 : le début de ligne est positionné automatiquement.
- Ligne 6 : l’éditeur indente automatiquement le début de ligne et le codeur doit retirer lui-même l’indentation avec la touche Retour-Arrière.
Dans un éditeur adapté au langage Python, le programmeur n’a pas à gérer l’indentation de son code. En fait, ce que l’éditeur ne gère pas automatiquement, c’est la fin de l’indentation, autrement dit le moment où le bloc indenté se termine et qu’il faut diminuer l’indentation, ce qui dépend seulement du souhait du programmeur et que l’éditeur ne peut deviner.
Instructions if
imbriquées¶
Le corps d’une instruction if
peut être n’importe quelle instruction, en particulier une nouvelle instruction if
.
Exemple
1 2 3 4 5 | n = 3000
if n % 10 == 0:
q = n // 10
if q % 10 == 0:
print("n est multiple de 100")
|
6 | n est multiple de 100
|
Une instruction if
est une instruction multiple. Le corps d’une instruction if
peut être de taille quelconque et contenir tout type d’instructions.
Indentation d’une instruction composée¶
Soit le code d’une instruction if
typique :
1 2 3 4 5 6 7 | x = -100
if x < 0:
print("x est negatif")
print(-x)
print("Fin du programme")
|
Le programme ci-dessus contient trois instructions :
- Ligne 1 : une instruction simple (affectation)
- Lignes 3-5 : l’instruction
if
qui est une instruction composée. - Ligne 7 : une instruction simple (instruction d’affichage)
Ces trois instructions sont indentées avec la même valeur d’indentation qui est de 0 espace par rapport à la marge gauche du code.
On observe toutefois (lignes 4-5) que certaines lignes du code sont indentées.
Règles fondamentales de l’indentation¶
L’instruction if
(lignes 3-5) est une instruction composée et son indentation doit respecter deux règles fondamentales :
- Règle 1 : si le corps de l’instruction
if
est placé sur plusieurs lignes, ce corps est indenté par rapport à la ligne d’en-tête ; - Règle 2 : toutes les instructions dans le corps de l’instruction sont à la même indentation. Autrement dit, si par exemple la 1ère instruction du corps de l’instruction
if
(ici ligne 4) est indentée de 4 espaces par rapport à l’en-tête, toutes les autres instructions du corps de l’instructionif
, par exemple ici la ligne 5, seront aussi indentées de 4 espaces par rapport à l’en-tête.
Non-respect des règles¶
Règle 1¶
Le code ci-dessous ne respecte pas la règle 1 :
1 2 3 4 5 6 7 | x = -100
if x < 0:
print("x est negatif")
print(-x)
print("Fin du programme")
|
- Lignes 4-5 : ces deux lignes devraient être indentées.
et l’exécution va générer un message d’erreur d’indentation au niveau de la ligne 4 :
7 8 9 10 | File "if_erreur1_indentation.py", line 4
print("x est negatif")
^
IndentationError: expected an indented block
|
- Lignes 8-11 : Le message d’erreur.
- Lignes 8 : Le nom du fichier-source et le numéro de ligne à l’origine de l’erreur sont fournis.
- Lignes 9-10 : La ligne à l’origine de l’erreur et un marqueur (le signe circonflexe
^
) signalant où l’erreur est rencontré dans la ligne. - Ligne 11 : Le type d’erreur, ici
IndentationError
(erreur d’indentation) et une description sommaire de la raison de cette erreur.
Règle 2¶
Le code ci-dessous ne respecte pas la règle 2 :
if_erreur2_indentation.py
1 2 3 4 5 6 7 | x = -100
if x < 0:
print("x est negatif")
print(-x)
print("Fin du programme")
|
- Lignes 4-5 : ces deux lignes devraient être à un même niveau d’indentation. Or la ligne 4 est indentée de 5 espaces et la ligne suivante de 4 espaces au lieu de 5.
et l’exécution va générer un message d’erreur d’indentation au niveau de la ligne 5:
if_erreur2_indentation.py
7 8 9 10 | File "if_erreur2_indentation.py", line 5
print(-x)
^
IndentationError: unindent does not match any outer indentation level
|
- Ligne 10 : Le message explique que l’indentation n’est pas uniforme. L’indentation de la ligne 4 est acceptée pas celle de la ligne 5.
Noter que la règle d’indentation s’applique aussi à une instruction if
emboîtée :
1 2 3 4 5 | n = 3000
if n % 10 == 0:
q = n // 10
if q % 10 == 0:
print("n est multiple de 100")
|
- Lignes 4-5 : instruction composée emboîtée.
Régler un montant avec des coupures de même valeur¶
On vous donne la valeur b
d’un billet en euros, par exemple b = 10
et un montant m
, nombre entier représentant un montant en euros à régler, par exemple, m = 8181
. Déterminer le nombre minimum N
de billets de b
euros pour être en mesure de régler le montant m.
Par exemple,
- si
b = 10
etm = 8181
alorsN = 819
- si
b = 10
etm = 800
alorsN = 80
Solution
Il y a deux cas selon que le montant peut être réglé de manière exacte avec des billets de montant b
. Par exemple, si b=10
et m=8181
, le montant ne peut être réglé de manière exacte (sans rendu de monnaie). Le nombre exact de billets est clairement 819 car avec 818 billets on peut régler jusqu’à 8180 euros (et il manque 1 euro) et avec un billet de plus, on peut régler le montant (et il restera neuf euros) ; ce dernier nombre (819) est une unité de plus que le quotient entier de m
par b
. D’où le code :
b= 10
m=8181
N=m//b
r=m%b
if r!=0:
N=N +1
print("b = ", b, "m =", m, "->", N)
print("->", N)
print()
b= 10
m=800
N=m//b
r=m%b
if r!=0:
N=N +1
print("b = ", b, "m =", m, "->", N)
print("->", N)
b = 10 m = 8181 -> 819
-> 819
b = 10 m = 800 -> 80
-> 80
- Lignes 16 et 17 : s’il est possible de payer exactement la somme
m
avec des billetsb
alors la condition ligne 16 est fausse et c’estN
qui donne la réponse attendue.
On peut aussi utiliser else
:
if m%b!=0:
N=m//b +1
else:
N=m//b