Stage Toussaint · dès le 19 octobre
Majorant
📘 Fiche de cours · 1re année📐 MPSI💻 Informatique Informatique communeNiveau · Terminale → Sup

Boucles for et while

Répéter une action : boucle for avec range, boucle while qui termine, et le motif de l'accumulateur (somme, compteur) — avec table de trace, pièges et exercices corrigés.

Fiche rédigée par les mentors Majorant — alumni Polytechnique, CentraleSupélec et Mines Paris.

1 définitionsMis à jour le 2026-08-02

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.

Objectif passerelle Terminale → Sup — Écrire une boucle 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]
🎯 Accompagnement Majorant

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

Définition 1.1 — Boucle for

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)
🔍 Décryptage ligne par ligne
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.
Trace de for j in range(5, 0, -1): print(j)
Tourjj > 0 ?Affichage
15oui5
24oui4
33oui3
42oui2
51oui1
0non (exclu)arrêt
📝 Compter les tours. Pour 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 15
🔍 Décryptage ligne par ligne
for 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]).
📝 Quelle version choisir ? Si tu n'as besoin que des valeurs, choisis le parcours par élément (A), plus simple et plus sûr. Si tu as besoin de la position ou d'accéder à plusieurs cases à la fois, passe par l'indice (B).
⚠ len(notes), pas len(notes) − 1. On écrit 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)          # 128
🔍 Décryptage ligne par ligne
n = 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.
Trace de la boucle qui double n tant que n < 100
Tourn avant testn < 100 ?n après (× 2)
11oui2
22oui4
34oui8
48oui16
516oui32
632oui64
764oui128
128nonsortie, print 128
📝 La sentinelle. Une variante fréquente : on parcourt des données jusqu'à rencontrer une valeur spéciale qui signale la fin (par exemple -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 = 13
🔍 Décryptage ligne par ligne
while 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.
⚠ La boucle infinie. Toute boucle 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 = 120
🔍 Décryptage — patron « somme »
somme = 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.
Trace de l'accumulateur « somme » pour range(1, 5)
Tourisomme avantsomme après
1101
2213
3336
44610

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)       # 15
🔍 Décryptage — patron « maximum »
maxi = 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.
📝 Le bon point de départ. Somme → 0, produit → 1, compteur → 0, maximum → premier élément (ou -infini). Choisir la mauvaise valeur de départ est l'erreur la plus fréquente sur ce motif.
🎯 Passer du « je lis » au « j'écris »

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, 5
🔍 Décryptage ligne par ligne
breakSortie 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"
🔍 Décryptage — while True + break
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.
⚠ Éviter la boucle infinie. Une boucle infinie n'est pas un bug rare : c'est le piège par défaut d'un 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é.

Exo 1Somme des entiers de 1 à nFacile

É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
On veut aller de 1 à 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.
L'accumulateur somme part de 0 puis grimpe : 0 → 1 → 3 → 6 → 10 → 15.
Affichage : 15.
Exo 2Compter les multiples de 3Intermédiaire

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
On parcourt par élément : 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).
Le compteur, parti de 0, s'incrémente trois fois. Affichage : 3.
Exo 3Prévoir la sortie d'un whileIntermédiaire

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
Trace de la boucle (division entière par 2)
Tourn avant testn > 1 ?n après (// 2)c
110oui51
25oui22
32oui13
1non3
La condition 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.

⚠ Le compteur non incrémenté (boucle infinie). Écrire 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.
⚠ L'erreur de bornes (off-by-one). Croire que 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).
⚠ Modifier la variable de boucle dans un for. Dans 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.
⚠ Confondre for et while. Utiliser un 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) ou maximum(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 while qui 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) et range(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'est b − 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 que while (jusqu'à une condition) ?
  • Sais-tu pourquoi une boucle while doit 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) et continue (passer au tour suivant) ?
  • Sais-tu utiliser while True avec un break comme vraie condition d'arrêt ?
  • Sais-tu dérouler une boucle dans une table de trace pour vérifier ton code ?

Débloque la fiche complète

Théorèmes, démonstrations à savoir refaire, méthodes-types et pièges de concours : crée ton compte gratuit pour tout lire. Une seule fois pour toutes les fiches et ressources Majorant.

Gratuit · vos données restent confidentielles.

Valide tes acquis

Quiz — Boucles

8 questions · une à la fois · seuil de maîtrise 80 %.

Informatique commune · Terminale → SupQuiz — Boucles for et whileQuestion 1 / 8
FacileChoix unique1 pt

Quelles valeurs prend i dans for i in range(4) ?

Sélectionne une réponse pour valider.

Fiches associées

📐 MPSI·Informatique

Recherche par dichotomie

La recherche dichotomique dans un tableau trié, expliquée ligne par ligne : code Python commenté, exécution pas à pas, preuve de terminaison et de correction (variant d-g, invariant de boucle), version récursive et complexité O(log n).

📐 MPSI·Informatique

Variables, types et affectations

Les briques de base de Python pour bien démarrer la prépa : affectation, types int/float/bool/str, conversions, opérateurs (/ // %), f-strings — avec les pièges classiques et deux exercices corrigés.

📐 MPSI·Informatique

Conditions et booléens

Faire choisir un programme : booléens, comparaisons, if / elif / else, rôle de l'indentation, et combinaison de conditions avec and / or / not — avec pièges et exercices corrigés.

📐 MPSI·Informatique

Fonctions : paramètres et valeurs de retour

Définir et appeler une fonction, comprendre paramètres et valeur de retour, et surtout ne jamais confondre return (renvoie) et print (affiche) — avec pièges et exercices corrigés.

📐 MPSI·Informatique

Listes et chaînes de caractères

Créer, indexer, parcourir et découper des listes et des chaînes ; comprendre qu'une liste est modifiable et une chaîne non — avec les pièges d'indices et deux exercices corrigés.

📐 MPSI·Informatique

Manipuler les listes

Créer et modifier une liste, ajouter et retirer des éléments, trier avec sort et sorted, découper au slicing et découvrir les compréhensions — avec le piège de l'alias et deux exercices corrigés.

Tu veux aller plus loin sur ce chapitre ?

Nos mentors ont passé les mêmes concours, en MPSI, deux à trois ans plus tôt. Ils reprennent ce chapitre avec toi — démonstrations détaillées, exercices type concours, oraux blancs.

Cours particuliers d'informatique en MPSI

Voir aussi : Cours particuliers d'informatique en prépa scientifique