Vue d'ensemble
Répéter une action, c'est le cœur de l'algorithmique : dès qu'on veut traiter tous les éléments
d'une liste, additionner mille nombres ou chercher jusqu'à trouver, on ne réécrit pas mille lignes,
on boucle. Python offre deux outils. La boucle for sert quand on connaît
le nombre de répétitions à l'avance (ou qu'on parcourt une collection) ; la boucle
while sert quand on répète tant qu'une condition reste vraie, sans
savoir combien de tours cela prendra.
Toute la difficulté tient en trois réflexes : choisir la bonne boucle, la faire progresser à chaque tour, et éviter la boucle infinie. Cette fiche décortique chaque motif ligne par ligne et te donne des tables de trace pour « voir » ce qui se passe tour après tour.
for avec
range (à 1, 2 ou 3 arguments), une boucle while qui termine, le motif de
l'accumulateur (somme, comptage, produit, maximum), et maîtriser break / continue.
Prérequis
- Variables, types et expressions
- Conditions et booléens (indispensables pour la condition d'un
while) - Listes : savoir accéder à un élément par son indice avec
liste[i]
Tu « ne vois pas » ce que fait une boucle tour après tour ? C'est le point de bascule de la programmation. Nos mentors alumni X · Centrale · Mines t'entraînent à dérouler une boucle à la main jusqu'à ce que ça devienne un réflexe.
Trouver un mentor →1. La boucle for et range
for i in range(...) répète le bloc indenté en donnant à la variable i
des valeurs successives fournies par range. Quand la source de valeurs est épuisée,
la boucle s'arrête et le programme continue après le bloc indenté.
Tout se joue dans range, qui s'utilise avec 1, 2 ou 3 arguments.
Point commun à retenir : la borne de fin est toujours exclue.
# 1 argument : range(n) -> de 0 a n-1
for i in range(4):
print(i) # 0, 1, 2, 3 (4 est EXCLU)
# 2 arguments : range(a, b) -> de a a b-1
for i in range(2, 6):
print(i) # 2, 3, 4, 5
# 3 arguments : range(a, b, pas) -> de a a b-1 par bonds de "pas"
for k in range(2, 11, 2):
print(k) # 2, 4, 6, 8, 10
# pas negatif : on compte a l'envers
for j in range(5, 0, -1):
print(j) # 5, 4, 3, 2, 1 (0 est EXCLU)range(4)0, 1, 2, 3. Quatre valeurs, mais 4 est exclu. C'est la source d'erreur n°1 : range(4) ne contient jamais 4.range(2, 6)Début inclus, fin exclue. On part de 2 et on s'arrête avant 6 : 2, 3, 4, 5. Le nombre de valeurs vaut 6 − 2 = 4.range(2, 11, 2)Début, fin exclue, pas. On part de 2, on avance de 2 en 2, on s'arrête avant 11 : 2, 4, 6, 8, 10.range(5, 0, -1)Le pas négatif. On part de 5 et on descend de 1 en 1, en s'arrêtant avant 0 : 5, 4, 3, 2, 1. Indispensable pour parcourir à l'envers.| Tour | j | j > 0 ? | Affichage |
|---|---|---|---|
| 1 | 5 | oui | 5 |
| 2 | 4 | oui | 4 |
| 3 | 3 | oui | 3 |
| 4 | 2 | oui | 2 |
| 5 | 1 | oui | 1 |
| — | 0 | non (exclu) | arrêt |
range(a, b) avec un pas de 1, le nombre de
tours est exactement b − a. Pour range(n), c'est n. Ce petit
calcul évite 90 % des erreurs de bornes.
2. Parcourir par élément ou par indice
Quand on a une liste, il existe deux façons de la parcourir avec un for.
Bien les distinguer évite de gros malentendus.
notes = [12, 8, 15]
# (A) parcours PAR ELEMENT : x prend directement les valeurs
for note in notes:
print(note) # 12, puis 8, puis 15
# (B) parcours PAR INDICE : i prend les positions 0, 1, 2
for i in range(len(notes)):
print(i, notes[i]) # 0 12 / 1 8 / 2 15for note in notes:Parcours par élément. À chaque tour, note est une valeur de la liste (12, puis 8, puis 15). Le plus lisible quand on n'a besoin que des valeurs.range(len(notes))len donne la longueur. Ici len(notes) vaut 3, donc range(3) produit 0, 1, 2 : exactement les indices valides de la liste.notes[i]Parcours par indice. i est la position ; notes[i] est la valeur à cette position. Utile quand on a besoin du numéro de l'élément (ou de comparer notes[i] et notes[i+1]).range(len(notes)) et
non range(len(notes) - 1) : comme la borne de fin est exclue,
range(3) donne bien 0, 1, 2, soit les trois indices. Retrancher 1 oublierait le dernier élément.
3. La boucle while
while condition: répète le bloc tant que la condition est vraie.
Trois ingrédients sont toujours présents : une initialisation avant la boucle,
une condition d'arrêt testée à chaque tour, et une progression dans
le corps qui rapproche la condition de « faux ». Oublie la progression et la boucle tourne à l'infini.
n = 1
while n < 100:
n = n * 2
print(n) # 128n = 1Initialisation. On prépare la variable testée par la boucle.while n < 100:Condition d'arrêt. Testée avant chaque tour : si n < 100 est vrai, on exécute le bloc ; sinon on sort.n = n * 2La progression. On double n à chaque tour. C'est ce qui fait avancer vers l'arrêt.print(n)Après la boucle. On sort dès que n dépasse 100 : la première puissance de 2 supérieure ou égale à 100 est 128.| Tour | n avant test | n < 100 ? | n après (× 2) |
|---|---|---|---|
| 1 | 1 | oui | 2 |
| 2 | 2 | oui | 4 |
| 3 | 4 | oui | 8 |
| 4 | 8 | oui | 16 |
| 5 | 16 | oui | 32 |
| 6 | 32 | oui | 64 |
| 7 | 64 | oui | 128 |
| — | 128 | non | sortie, print 128 |
-1). Cette
valeur-drapeau s'appelle une sentinelle.
valeurs = [4, 7, 2, -1, 9]
i = 0
somme = 0
while valeurs[i] != -1: # -1 est la sentinelle : elle arrete le parcours
somme = somme + valeurs[i]
i = i + 1
print(somme) # 4 + 7 + 2 = 13while valeurs[i] != -1:Condition d'arrêt = sentinelle. On continue tant que la case courante n'est pas -1. Dès qu'on tombe sur -1, on sort sans l'ajouter.somme = somme + valeurs[i]Traitement. On additionne la valeur courante.i = i + 1La progression. On avance d'une case. Sans elle, on relirait éternellement valeurs[0] : boucle infinie.while doit modifier, dans son corps,
une variable qui rapproche la condition de « faux ». Oublier i = i + 1 (ou
n = n * 2) et le programme ne s'arrête jamais.
4. Le motif de l'accumulateur
Un accumulateur est une variable initialisée avant la boucle, puis mise à jour à chaque tour pour « accumuler » un résultat. Quatre usages reviennent sans arrêt : la somme, le comptage, le produit et le maximum. À chaque fois, la clé est de bien choisir la valeur de départ.
# SOMME : on part de 0 (element neutre de l'addition)
somme = 0
for i in range(1, 5):
somme = somme + i
print(somme) # 1 + 2 + 3 + 4 = 10
# PRODUIT (factorielle) : on part de 1 (element neutre du produit)
produit = 1
for i in range(1, 6):
produit = produit * i
print(produit) # 1 * 2 * 3 * 4 * 5 = 120somme = 0Valeur de départ = 0. Ajouter le premier élément à 0 ne le change pas : c'est l'élément neutre de l'addition.somme = somme + iLa mise à jour. On lit l'ancienne valeur, on lui ajoute i, on range le tout dans somme. Pour le produit, on remplacerait par produit = produit * i et le départ par 1.| Tour | i | somme avant | somme après |
|---|---|---|---|
| 1 | 1 | 0 | 1 |
| 2 | 2 | 1 | 3 |
| 3 | 3 | 3 | 6 |
| 4 | 4 | 6 | 10 |
Deux variantes très courantes : compter les éléments qui vérifient une condition, et trouver le maximum.
notes = [12, 8, 15, 6, 11]
# COMPTAGE : combien de notes >= 10 ?
compteur = 0
for note in notes:
if note >= 10:
compteur = compteur + 1
print(compteur) # 12, 15, 11 -> 3
# MAXIMUM : la meilleure note
maxi = notes[0]
for note in notes:
if note > maxi:
maxi = note
print(maxi) # 15maxi = notes[0]Départ = premier élément. On ne part surtout pas de 0 : si toutes les notes étaient négatives, 0 fausserait le résultat. On prend donc la première valeur comme candidat.if note > maxi:La comparaison. À chaque tour, si l'élément courant bat le record, on met à jour maxi.maxi = noteNouveau record. On mémorise la meilleure valeur vue jusqu'ici. À la fin, maxi contient le maximum de toute la liste.-infini). Choisir la mauvaise valeur de départ est l'erreur la plus fréquente
sur ce motif.
Comprendre un accumulateur c'est bien ; l'écrire seul sous pression, c'est un autre sport. Nos mentors (alumni X · Centrale · Mines) te font coder ces motifs en direct, corrigent tes réflexes et te préparent aux TP et concours d'informatique.
Réserver une séance →5. Maîtriser le flux : break, continue et boucle infinie
Deux mots-clés permettent de piloter finement une boucle : break pour en
sortir immédiatement, et continue pour passer directement au
tour suivant. Bien utilisés, ils rendent le code plus clair ; mal maîtrisés, ils créent des
boucles infinies.
# break : on sort de la boucle des que i vaut 3
for i in range(10):
if i == 3:
break
print(i) # 0, 1, 2 (puis on sort, on n'affiche PAS 3)
# continue : on saute l'affichage pour les nombres pairs
for i in range(6):
if i % 2 == 0:
continue
print(i) # 1, 3, 5breakSortie immédiate. Dès que i == 3, on quitte complètement la boucle. Les tours 3 à 9 n'ont jamais lieu.continueTour suivant. Quand i est pair, continue saute le reste du corps et repart au tour d'après. Le print n'est atteint que pour les impairs.
Un idiome très répandu combine while True (boucle « toujours vraie ») avec un
break qui fournit la vraie condition d'arrêt à l'intérieur.
n = 1
while True:
print(n)
n = n + 1
if n > 3:
break # LA condition de sortie est ici
print("fini") # affiche 1, 2, 3 puis "fini"while True:Condition toujours vraie. Seule, cette ligne boucle à l'infini : c'est break qui doit garantir la sortie.if n > 3: breakLa vraie condition d'arrêt. On affiche 1, 2, 3 ; quand n devient 4, la condition est vraie et on sort. La progression n = n + 1 reste indispensable.while mal écrit. Règle absolue : à chaque tour, quelque
chose doit faire progresser la condition d'arrêt (incrémenter un compteur, avancer un indice,
ou atteindre un break). Avant d'exécuter, demande-toi toujours : « qu'est-ce qui garantit
que cette boucle s'arrête ? »
6. Exercices d'application
À faire de tête (ou sur brouillon) avant d'ouvrir le corrigé.
Écris une boucle qui calcule 1 + 2 + ... + n. Que vaut somme pour n = 5 ?
n = 5
somme = 0
for i in range(1, n + 1):
somme = somme + i
print(somme)Voir la correction détaillée
n inclus : comme la borne de fin est exclue, on écrit range(1, n + 1), soit range(1, 6) qui donne 1, 2, 3, 4, 5.somme part de 0 puis grimpe : 0 → 1 → 3 → 6 → 10 → 15.Combien d'éléments de la liste sont des multiples de 3 ? Complète mentalement.
liste = [3, 7, 9, 4, 12, 5]
compteur = 0
for x in liste:
if x % 3 == 0:
compteur = compteur + 1
print(compteur)Voir la correction détaillée
x vaut successivement 3, 7, 9, 4, 12, 5.x % 3 == 0 teste la divisibilité par 3. C'est vrai pour 3, 9 et 12 (les autres laissent un reste non nul).Sans exécuter, prédis la valeur affichée en déroulant la boucle dans une table de trace.
n = 10
c = 0
while n > 1:
n = n // 2
c = c + 1
print(c)Voir la correction détaillée
| Tour | n avant test | n > 1 ? | n après (// 2) | c |
|---|---|---|---|---|
| 1 | 10 | oui | 5 | 1 |
| 2 | 5 | oui | 2 | 2 |
| 3 | 2 | oui | 1 | 3 |
| — | 1 | non | — | 3 |
n > 1 devient fausse quand n atteint 1 : on sort. Affichage : 3 (le nombre de divisions par 2 pour passer de 10 à 1).7. Erreurs classiques (les pièges qui coûtent des points)
Ces quatre erreurs reviennent dans presque toutes les copies. Les connaître à l'avance, c'est déjà la moitié du travail.
while n < 5: print(n) sans jamais faire n = n + 1 : n reste à
sa valeur de départ, la condition est éternellement vraie, le programme se fige. Vérifie toujours que
la variable testée change dans le corps.
range(4) contient 4, ou
écrire range(1, n) en pensant aller jusqu'à n. La borne de fin est
exclue : pour aller de 1 à n inclus, il faut range(1, n + 1).
for i in range(5):,
réaffecter i = i + 2 à l'intérieur ne « saute » pas de tours : au tour suivant,
range réimpose la valeur prévue. Pour contrôler le pas, on change range(...)
lui-même, pas i à la main.
while avec un compteur manuel
alors qu'on connaît le nombre de tours (plus long et plus risqué), ou vouloir un for
alors qu'on doit répéter jusqu'à une condition imprévisible. Règle : nombre de tours connu →
for ; répéter jusqu'à une condition → while.
8. Pour aller plus loin
Les boucles sont la brique de base : presque tout le reste de l'informatique de prépa les réinvestit. Voici trois chapitres où tu les retrouveras immédiatement.
- Fonctions — pour encapsuler une boucle réutilisable (une fonction
somme(liste)oumaximum(liste)) et lui donner un nom. - Listes et chaînes de caractères — le terrain de jeu naturel du parcours par élément et par indice, et de tous les motifs d'accumulateur.
- Recherche par dichotomie — un
whilequi divise l'intervalle par deux à chaque tour : l'exemple type d'une boucle dont on doit prouver qu'elle termine.
Récap final — Ce qu'il faut absolument retenir
Tu dois pouvoir répondre « oui » sans hésiter à chaque point.
- Sais-tu que
range(n)va de 0 àn − 1(n exclu) ? - Sais-tu lire
range(a, b)etrange(a, b, pas)(début inclus, fin exclue, pas) ? - Sais-tu écrire une boucle décroissante avec
range(5, 0, -1)? - Sais-tu compter le nombre de tours d'un
range(a, b)(c'estb − a) ? - Sais-tu distinguer le parcours par élément (
for x in liste) du parcours par indice (for i in range(len(liste))) ? - Sais-tu quand choisir
for(nombre de tours connu) plutôt quewhile(jusqu'à une condition) ? - Sais-tu pourquoi une boucle
whiledoit modifier sa variable de test à chaque tour ? - Sais-tu ce qu'est une sentinelle et comment l'utiliser comme condition d'arrêt ?
- Sais-tu écrire les quatre accumulateurs (somme → 0, produit → 1, compteur → 0, maximum → premier élément) ?
- Sais-tu ce que font
break(sortir) etcontinue(passer au tour suivant) ? - Sais-tu utiliser
while Trueavec unbreakcomme vraie condition d'arrêt ? - Sais-tu dérouler une boucle dans une table de trace pour vérifier ton code ?