05 - Boucles
Pourquoi les boucles ?
En programmation, on a souvent besoin de répéter une action : afficher les éléments d’une liste, calculer une somme, traiter chaque ligne d’un fichier, etc. Écrire manuellement chaque instruction serait fastidieux et peu flexible. Les boucles permettent de répéter un bloc d’instructions autant de fois que nécessaire.
Python propose deux types de boucles : la boucle for (quand on connaît le nombre de répétitions) et la boucle while (quand on répète tant qu’une condition est vérifiée).
La boucle for
Parcourir une séquence
La boucle for parcourt les éléments d’une séquence (liste, chaîne, tuple, etc.) un par un :
jours = ["lundi", "mardi", "mercredi", "jeudi", "vendredi"]
for jour in jours:
print(f"Aujourd'hui c'est {jour}")
Aujourd'hui c'est lundi
Aujourd'hui c'est mardi
Aujourd'hui c'est mercredi
Aujourd'hui c'est jeudi
Aujourd'hui c'est vendredi
À chaque tour de boucle, la variable jour prend la valeur de l’élément suivant de la liste.
Parcourir une chaîne de caractères
mot = "NSI"
for lettre in mot:
print(lettre, end=" ")
N S I
La fonction range()
La fonction range() génère une séquence de nombres entiers. Elle est très utilisée avec la boucle for :
# range(n) : de 0 à n-1
for i in range(5):
print(i, end=" ")
0 1 2 3 4
# range(début, fin) : de début à fin-1
for i in range(2, 7):
print(i, end=" ")
2 3 4 5 6
# range(début, fin, pas) : de début à fin-1, par pas
for i in range(0, 20, 5):
print(i, end=" ")
0 5 10 15
Attention : comme pour le slicing, la borne de fin est exclue.
Parcours par indice
On peut combiner range() et len() pour parcourir une séquence par ses indices :
fruits = ["pomme", "banane", "cerise"]
for i in range(len(fruits)):
print(f"Fruit n°{i} : {fruits[i]}")
Fruit n°0 : pomme
Fruit n°1 : banane
Fruit n°2 : cerise
Parcours avec enumerate()
La fonction enumerate() fournit à la fois l’indice et l’élément, ce qui est plus élégant :
fruits = ["pomme", "banane", "cerise"]
for i, fruit in enumerate(fruits):
print(f"Fruit n°{i} : {fruit}")
Fruit n°0 : pomme
Fruit n°1 : banane
Fruit n°2 : cerise
Accumuler un résultat
Un schéma très courant consiste à initialiser une variable (un accumulateur) puis à la modifier à chaque tour de boucle :
# Calculer la somme des nombres de 1 à 5
total = 0
for i in range(1, 6):
total += i
print(f"La somme vaut {total}")
La somme vaut 15
Trace d’exécution. Pour bien comprendre, suivons les valeurs des variables à chaque tour de boucle :
| Tour | i | total avant | total += i | total après |
|---|---|---|---|---|
| 1 | 1 | 0 | 0 + 1 | 1 |
| 2 | 2 | 1 | 1 + 2 | 3 |
| 3 | 3 | 3 | 3 + 3 | 6 |
| 4 | 4 | 6 | 6 + 4 | 10 |
| 5 | 5 | 10 | 10 + 5 | 15 |
Ce tableau s’appelle une trace d’exécution (ou table de trace). C’est un outil essentiel pour comprendre et vérifier le comportement d’un programme.
# Construire une chaîne lettre par lettre
mot = "Python"
resultat = ""
for lettre in mot:
resultat += lettre + "-"
print(resultat)
P-y-t-h-o-n-
La boucle while
Principe
La boucle while répète un bloc d’instructions tant qu’une condition est vraie :
compteur = 1
while compteur <= 5:
print(compteur)
compteur += 1
1
2
3
4
5
Trace d’exécution :
| Tour | compteur | compteur <= 5 ? | Action | compteur après |
|---|---|---|---|---|
| 1 | 1 | Vrai | affiche 1 | 2 |
| 2 | 2 | Vrai | affiche 2 | 3 |
| 3 | 3 | Vrai | affiche 3 | 4 |
| 4 | 4 | Vrai | affiche 4 | 5 |
| 5 | 5 | Vrai | affiche 5 | 6 |
| — | 6 | Faux | sortie de boucle | — |
Attention : si la condition ne devient jamais fausse, la boucle tourne indéfiniment (boucle infinie). Il faut toujours s’assurer que quelque chose dans le corps de la boucle finira par rendre la condition fausse.
Quand utiliser while plutôt que for ?
On utilise while lorsqu’on ne sait pas à l’avance combien de fois la boucle va s’exécuter :
# Demander un mot de passe jusqu'à obtenir le bon
mot_de_passe = ""
while mot_de_passe != "nsi2026":
mot_de_passe = input("Mot de passe : ")
print("Accès autorisé !")
# Trouver la plus petite puissance de 2 supérieure à 1000
puissance = 1
while puissance <= 1000:
puissance *= 2
print(puissance) # 1024
Simuler un do...while
Python n’a pas de boucle do...while. Pour exécuter le corps au moins une fois, on peut utiliser while True avec break :
while True:
reponse = input("Entrez un nombre positif : ")
nombre = int(reponse)
if nombre > 0:
break
print("Erreur : le nombre doit être positif !")
print(f"Vous avez entré {nombre}")
Instructions de contrôle
break : sortir de la boucle
L’instruction break interrompt immédiatement la boucle, même si la condition est encore vraie ou que la séquence n’est pas terminée :
# Chercher la première voyelle dans un mot
mot = "python"
for lettre in mot:
if lettre in "aeiouy":
print(f"Première voyelle : {lettre}")
break
Première voyelle : y
continue : passer au tour suivant
L’instruction continue saute le reste du bloc et passe directement au tour suivant :
# Afficher uniquement les nombres impairs de 1 à 10
for i in range(1, 11):
if i % 2 == 0:
continue
print(i, end=" ")
1 3 5 7 9
Boucles imbriquées
On peut placer une boucle à l’intérieur d’une autre boucle. La boucle intérieure s’exécute entièrement à chaque tour de la boucle extérieure :
for i in range(1, 4):
for j in range(1, 4):
print(f"{i} × {j} = {i*j}", end=" ")
print() # retour à la ligne
1 × 1 = 1 1 × 2 = 2 1 × 3 = 3
2 × 1 = 2 2 × 2 = 4 2 × 3 = 6
3 × 1 = 3 3 × 2 = 6 3 × 3 = 9
Autre exemple : parcourir une matrice (liste de listes) :
matrice = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
for ligne in matrice:
for element in ligne:
print(element, end=" ")
print()
1 2 3
4 5 6
7 8 9
Le piège de la boucle infinie
Une boucle infinie est une boucle dont la condition ne devient jamais fausse. Le programme tourne alors indéfiniment et il faut l’interrompre manuellement (Ctrl+C dans le terminal, ou bouton Stop dans l’éditeur).
# NE PAS EXÉCUTER : boucle infinie !
n = 1
while n <= 5:
print(n)
# Oubli : n n'est jamais incrémenté, donc n reste à 1
# La condition n <= 5 est toujours vraie → boucle infinie
La trace montre le problème :
| Tour | n | n <= 5 ? | Action |
|---|---|---|---|
| 1 | 1 | Vrai | affiche 1, n ne change pas |
| 2 | 1 | Vrai | affiche 1, n ne change pas |
| 3 | 1 | Vrai | affiche 1, n ne change pas |
| … | 1 | Vrai | indéfiniment |
La correction est simple : il faut ajouter n += 1 dans le corps de la boucle.
Erreurs fréquentes
Modifier la variable de boucle dans un for : la modification n’a aucun effet sur le parcours.
for i in range(5):
i = 100 # sans effet : i reprendra la valeur suivante au prochain tour
print(i) # affiche 100 à chaque tour, mais ne change rien au parcours
Erreur de borne dans range() : range(1, 5) va de 1 à 4, pas de 1 à 5. Pour aller de 1 à 5, il faut écrire range(1, 6).
Modifier une liste en la parcourant : cela peut produire des résultats imprévisibles. Il vaut mieux construire une nouvelle liste.
Résumé
| Concept | Syntaxe | Usage |
|---|---|---|
for | for x in sequence: | Nombre de tours connu |
while | while condition: | Nombre de tours inconnu |
range() | range(début, fin, pas) | Générer des entiers |
enumerate() | for i, x in enumerate(L): | Indice et élément |
break | break | Sortir de la boucle |
continue | continue | Passer au tour suivant |