Les instructions répétitives
Contenu de la page
5. Les instructions répétitives
Dans un programme, on doit pouvoir répéter plusieurs fois (voire indéfiniment !) les mêmes traitements. Une instruction répétitive ou boucle permet de répéter un certain nombre de fois le même bloc d’instructions. Il existe deux instructions répétitives en Python : la boucle while et la boucle for in.
5.1. La boucle while
La boucle while (cf. figure ci-dessous) permet de répéter
l’exécution d’un bloc d’instructions tant qu’une condition est vérifiée.
En revanche, dès que la condition devient fausse, l’exécution du bloc
d’instructions cesse et le programme se poursuit normalement en
séquence.
La boucle while
Sa syntaxe en Python est la suivante :
while exp_cond:
bloc_instructions
Il s’agit d’une instruction composée comportant :
une ligne d’en-tête terminée par le caractère
:while exp_cond :
un bloc d’instruction
bloc_instructions
Le bloc doit obligatoirement être indenté par rapport à la ligne d’en-tête. Cette indentation s’effectue de préférence avec quatre espaces consécutifs, ou bien avec un caractère de tabulation. Elle est souvent effectuée automatiquement par les éditeurs de code Python.
Littéralement, le fonctionnement d’une boucle while peut s’énoncer à
l’aide de la phrase : « Tant que la condition est vraie, exécuter le
bloc d’instructions ». Plus concrètement, voici ce qui se passe lors de
l’exécution d’une boucle while :
la valeur de la condition
exp_condest évaluéesi la condition est fausse, l’exécution du programme reprend en séquence après la boucle (
bloc_instructionsn’est pas exécuté)si la condition est vraie,
bloc_instructionsest exécuté, puis l’exécution du programme reprend sur la ligne d’en-tête où la valeur de la condition sera évaluée à nouveau, et ainsi de suite.
Généralement, le nombre d’exécutions du bloc qui seront réalisées ne
peut être connu à l’avance, mais dépend de la condition. Le programme
ci-dessous implémente un compte à rebours très basique en utilisant une
boucle while.
compteur = 10
print(f"Compte à rebours basique :")
while compteur>=0:
print(f"{compteur}")
compteur = compteur - 1
print("Terminé !!")
Compte à rebours basique :
10
9
8
7
6
5
4
3
2
1
0
Terminé !!
Le programme ci-dessous calcule le résultat de la factorielle d’un nombre.
n = int(input("Saisissez un nombre entier positif ou nul : "))
if n==0 or n==1:
facto = 1
else:
facto = n
mult = n-1
while mult>=1:
facto = facto*mult
mult = mult-1
print(f"Factorielle de {n} est égal à {facto}.")
Saisissez un nombre entier positif ou nul : 5
Factorielle de 5 est égal à 120.
5.2. La boucle for
La boucle for est une instruction répétitive qui est
particulièrement adaptée aux deux cas de figure suivants :
pour parcourir des séquences de valeurs entières et répéter le même traitement autant de fois qu’il y a de valeurs dans la séquence (ce traitement peut utiliser les valeurs de la séquence ou bien être totalement indépendant)
pour parcourir des objets itérables, c’est-à-dire des objets comprenant plusieurs éléments auxquels on peut accéder individuellement, et appliquer le même traitement sur chacun de leurs éléments.
5.2.1. Parcours de séquences de valeurs entières
Dans ce cas de figure, la syntaxe de la boucle for est la suivante :
for var in seq_val:
bloc_instructions
Il s’agit d’une instruction composée dans laquelle :
varest une variableseq_valest une séquence de nombres entiers générée par la fonctionrange()(voir plus loin dans ce chapitre)bloc_instructionsest un bloc d’instructions.
Le bloc d’instructions doit obligatoirement être indenté par rapport à
la ligne d’en-tête for var in seq_val:. Cette indentation s’effectue
de préférence avec quatre espaces consécutifs, ou bien avec un caractère
de tabulation. Elle est souvent effectuée automatiquement par les
éditeurs de code Python.
Littéralement, on peut énoncer le fonctionnement d’une telle boucle de
la manière suivante : « Pour chaque valeur entière var contenue dans
la séquence de valeurs seq_val exécuter le bloc d’instructions ».
Plus concrètement, la variable var va prendre successivement pour
valeur chacune des valeurs de seq_val, de la première à la dernière.
Pour chaque valeur, le bloc d’instructions est exécuté. La boucle
s’arrête lorsqu’une exécution du bloc a été réalisée pour chaque valeur
de seq_val.
5.2.1.1. La fonction range()
Comment générer cette fameuse séquence de valeurs seq_val ? C’est le
rôle de la fonction range(). Cette fonction prend une, deux ou trois
valeurs entières en paramètres et retourne une séquence ordonnée de
valeurs entières.
5.2.1.1.1. Syntaxe à un seul paramètre : range(n)
Lorsqu’un seul paramètre n est fourni, il correspond au nombre de
valeurs entières que doit contenir la séquence retournée. range(n)
retourne alors la séquence de n valeurs entières consécutives
commençant par 0. Par exemple :
range(6)retourne la séquence : 0, 1, 2, 3, 4, 5range(2)retourne la séquence : 0, 1
5.2.1.1.2. Syntaxe à deux paramètres : range(deb, fin)
Lorsque deux paramètres deb et fin sont fournis (tels que
deb≤fin) :
debest la valeur débutant la séquencefinest la première valeur non comprise dans la séquence
range(deb, fin) retourne alors la séquence de valeurs consécutives
commençant par deb et se terminant par fin-1. Par exemple :
range(3, 8)retourne la séquence : 3, 4, 5, 6, 7range(-2, 5)retourne la séquence : -2, -1, 0, 1, 2, 3, 4range(-10, -2)retourne la séquence : -10, -9, -8, -7, -6, -5, -4, -3
5.2.1.1.3. Syntaxe à trois paramètres : range(deb, fin, pas)
Lorsqu’un troisième paramètre pas est fourni, celui-ci correspond à
l’écart qu’il devra y avoir entre deux valeurs adjacentes de la séquence
retournée (en informatique, on appelle cela le pas).
range(deb, fin, pas) retourne alors la séquence de valeurs
commençant par deb et se terminant par fin-1, avec un écart de
pas entre deux valeurs. Par exemple :
range(3, 9, 2)retourne la séquence : 3, 5, 7range(3, 10, 2)retourne la séquence : 3, 5, 7, 9range(3, 10, 3)retourne la séquence : 3, 6, 9range(10, -1, -1)retourne la séquence : 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0range(-15, 1, 5)retourne la séquence : -15, -10, -5, 0
5.2.1.2. Premier exemple : affichage d’une suite de caractères identiques sur une même ligne
Maintenant que le fonctionnement de range() a été vu, voici un
premier exemple de programme basique utilisant la boucle for sur des
séquences de valeurs entières. Celui-ci saisit au clavier un nombre
entier nb, puis affiche sur la même ligne nb fois le caractère «
? ».
nb = int(input("Saisissez le nombre de symboles souhaité : "))
for i in range(nb):
print("?", end="")
Saisissez le nombre de symboles souhaité : 10
??????????
Notons que sur cet exemple, l’instruction réalisée dans le bloc :
print("?", end="") n’utilise pas les valeurs de la séquence
retournée par range(nb) (i.e., les valeurs successives de i).
Ces dernières ne servent donc qu’à compter le nombre de fois où
l’instruction doit être exécutée.
5.2.1.3. Deuxième exemple : calcul de la somme des n premiers entiers positifs
Dans ce deuxième exemple, le programme saisit au clavier un nombre
entier n, puis calcule et affiche la somme des n premiers
entiers positifs.
print("Calcul de la somme des n premiers entiers positifs.")
n = int(input("Saisissez la valeur de n :"))
somme = 0
for i in range(1, n+1):
somme = somme+i
print(f"La somme des {n} premiers entiers positifs est {somme}.")
Calcul de la somme des n premiers entiers positifs.
Saisissez la valeur de n : 15
La somme des 15 premiers entiers positifs est 120.
Cette fois-ci, l’instruction réalisée dans le bloc : somme = somme+i
va s’exécuter pour chaque valeur i de la séquence retournée par
range(1, n+1). Les valeurs de la séquence sont utilisées dans le
bloc d’instructions.
5.2.1.4. Troisième exemple : calcul de la somme des n premiers entiers positifs pairs
Voici pour finir une variante du programme précédent calculant la somme des entiers positifs pairs uniquement.
print("Calcul de la somme des n premiers entiers positifs pairs.")
n = int(input("Saisissez la valeur de n :"))
somme = 0
for i in range(2, n+1, 2):
somme = somme+i
print(f"La somme des {n} premiers entiers positifs pairs est {somme}.")
Calcul de la somme des n premiers entiers positifs pairs.
Saisissez la valeur de n : 15
La somme des 15 premiers entiers positifs pairs est 56.
5.2.2. Parcours d’objets itérables - Cas des chaînes de caractères
En Python, les chaînes sont des séquences de caractères et sont de ce
fait des objets itérables : cela signifie qu’on peut parcourir un
par un les caractères d’une chaîne, du premier jusqu’au dernier. La
boucle for est particulièrement adaptée pour parcourir les objets
itérables du premier jusqu’au dernier élément. Lorsqu’il s’agit d’une
chaîne, la syntaxe est la suivante :
for car in ch:
bloc_instructions
carest une variablechest une chaîne ou une variable contenant une chaînebloc_instructionsest un bloc d’instructions indenté par rapport à la lignefor car in ch:
Littéralement : « Pour chaque caractère car contenu dans la chaîne
ch exécuter le bloc d’instructions ». Concrètement, la variable
car va contenir successivement chacun des caractères de la chaîne
ch, du premier jusqu’au dernier. Pour chaque caractère, le bloc est
exécuté. Voici un exemple de programme qui saisit au clavier une chaîne,
puis qui affiche un par un les caractères qu’elle contient.
myname = input("Quel est votre prénom ?")
for car in myname:
print(car)
print(f"Au revoir {myname} !!")
Quel est votre prénom ? Anatole
A
n
a
t
o
l
e
Au revoir Anatole !!
Notons qu’une variante de ce programme consiste à parcourir la chaîne à
l’aide des indices de ses caractères, en utilisant la boucle for de
parcours de séquences de valeurs entières. Dans ce cas, la séquence de
valeurs à parcourir commence à l’indice 0 (indice du premier caractère)
et se termine à l’indice égal à la longueur de la chaîne moins 1 (indice
du dernier caractère). Voici ci-dessous cette variante.
myname = input("Quel est votre prénom ?")
for ind in range(0, len(myname)):
print(myname[ind])
print(f"Au revoir {myname} !!")
Quel est votre prénom ? Hippolyte
H
i
p
p
o
l
y
t
e
Au revoir Hippolyte !!
Nous venons de voir l’utilisation de la boucle for pour le parcours
caractère par caractère d’une chaîne. Il existe d’autres types objets
itérables, qui peuvent être parcourus intégralement à l’aide d’une
boucle for : listes, tuples, dictionnaires, etc. Ces types d’objets,
ainsi que la boucle for qui leur est associée, feront l’objet de
prochains chapitres.