Utilise while quand…
Tu ne sais pas à l’avance combien de fois boucler (saisie utilisateur, recherche, simulation, etc.)
Jusqu’à maintenant, chaque instruction de tes programmes s’exécute au plus une fois. Mais beaucoup de problèmes réels demandent de répéter une action plusieurs fois.
Imagine que tu veux afficher une table de multiplication :
print("5 x 1 =", 5 * 1)print("5 x 2 =", 5 * 2)print("5 x 3 =", 5 * 3)print("5 x 4 =", 5 * 4)print("5 x 5 =", 5 * 5)print("5 x 6 =", 5 * 6)print("5 x 7 =", 5 * 7)print("5 x 8 =", 5 * 8)print("5 x 9 =", 5 * 9)print("5 x 10 =", 5 * 10)Écrire le programme de cette façon fonctionne, mais c’est pénible. Et si on voulait aller jusqu’à 100 ? Ou jusqu’à un nombre choisi par l’utilisateur ? Il faudrait recopier des lignes sans fin — ou pire, ne pas pouvoir le faire du tout.
Le problème est encore plus criant avec les programmes interactifs. Pense à :
Dans tous ces cas, on a besoin d’un flux avec répétition — une boucle.
flowchart TD
A["Début"] --> B{"Condition<br/>encore vraie ?"}
B -- Oui --> C["Exécuter le bloc<br/>d'instructions"]
C --> B
B -- Non --> D["Suite du programme"]
Le flux ne descend plus simplement de haut en bas (comme avec le if-else) : il remonte pour ré-exécuter les mêmes instructions.
La boucle continue tant que la condition est vraie, puis le programme reprend son cours normal.
Reprenons la table de multiplication. Voici la version avec copier-coller à gauche, et la version avec boucle à droite :
print("5 x 1 =", 5 * 1)print("5 x 2 =", 5 * 2)print("5 x 3 =", 5 * 3)print("5 x 4 =", 5 * 4)print("5 x 5 =", 5 * 5)print("5 x 6 =", 5 * 6)print("5 x 7 =", 5 * 7)print("5 x 8 =", 5 * 8)print("5 x 9 =", 5 * 9)print("5 x 10 =", 5 * 10)i = 1while i <= 10: print("5 x", i, "=", 5 * i) i = i + 1La version avec boucle est nettement plus courte, et surtout elle s’adapte : change 10 par 1000 et ça fonctionne immédiatement, sans ajouter 990 lignes.
while: « Tant que »Le while se lit comme en français : « tant que la condition est vraie, exécute le bloc ».
while condition: instructionswhile:À chaque passage (appelé itération), Python :
True → exécute le bloc, puis revient à l’étape 1False → sort de la boucle et continue aprèscompteur = 1
while compteur <= 5: print(compteur) compteur = compteur + 1
print("Fini !")12345Fini !flowchart TD
A["compteur = 1"] --> B{"compteur <= 5 ?"}
B -- Oui --> C["Afficher compteur"]
C --> D["compteur = compteur + 1"]
D --> B
B -- Non --> E["Afficher 'Fini !'"]
Suivons l’exécution pas à pas :
| Itération | compteur au début | compteur <= 5 ? | Action |
|---|---|---|---|
| 1 | 1 | True | Affiche 1, compteur → 2 |
| 2 | 2 | True | Affiche 2, compteur → 3 |
| 3 | 3 | True | Affiche 3, compteur → 4 |
| 4 | 4 | True | Affiche 4, compteur → 5 |
| 5 | 5 | True | Affiche 5, compteur → 6 |
| 6 | 6 | False | Sort de la boucle |
On peut aussi compter en descendant :
compte = 5
while compte > 0: print(compte) compte = compte - 1
print("Décollage !")54321Décollage !Le while n’est pas limité au simple comptage. On peut accumuler un résultat au fil des itérations :
# Calculer la somme des nombres de 1 à 100somme = 0i = 1
while i <= 100: somme = somme + i i = i + 1
print("La somme de 1 à 100 est :", somme)La somme de 1 à 100 est : 5050C’est là que le while montre sa vraie force : répéter une action tant que l’utilisateur le décide :
reponse = "oui"
while reponse == "oui": nombre = float(input("Entre un nombre : ")) print("Le double est :", nombre * 2) reponse = input("Continuer ? (oui/non) : ")
print("Au revoir !")Entre un nombre : 7Le double est : 14.0Continuer ? (oui/non) : ouiEntre un nombre : 3.5Le double est : 7.0Continuer ? (oui/non) : nonAu revoir !Ici, c’est impossible de savoir à l’avance combien de fois la boucle va s’exécuter, car ça dépend de l’utilisateur.
C’est exactement le type de situation où while est indispensable.
Un des usages les plus courants du while est de redemander une valeur tant qu’elle n’est pas valide.
note = float(input("Note (0 à 100) : "))
while note < 0 or note > 100: print("Erreur : la note doit être entre 0 et 100.") note = float(input("Note (0 à 100) : "))
print("Note enregistrée :", format(note, ".2f"))Note (0 à 100) : -5Erreur : la note doit être entre 0 et 100.Note (0 à 100) : 150Erreur : la note doit être entre 0 et 100.Note (0 à 100) : 85Note enregistrée : 85.00flowchart TD
A["Lire la note"] --> B{"note < 0 ou<br/>note > 100 ?"}
B -- Oui --> C["Afficher l'erreur"]
C --> D["Relire la note"]
D --> B
B -- Non --> E["Note enregistrée"]
Dans l’exemple de validation ci-dessus, on écrit input() deux fois : une fois avant la boucle, et une fois à l’intérieur.
C’est agaçant et source d’erreurs (si tu modifies l’un sans l’autre).
Certains langages offrent une boucle do-while qui exécute le bloc au moins une fois avant de tester la condition :
// Pseudo-code (PAS du Python !)do { lire la note} while (note invalide)do-whilePython ne possède pas de structure do-while. Mais on peut la simuler avec while True et break :
while True: note = float(input("Note (0 à 100) : ")) if note >= 0 and note <= 100: break print("Erreur : la note doit être entre 0 et 100.")
print("Note enregistrée :", format(note, ".2f"))Note (0 à 100) : -5Erreur : la note doit être entre 0 et 100.Note (0 à 100) : 85Note enregistrée : 85.00flowchart TD
A["Début de la boucle"] --> B["Lire la note"]
B --> C{"note valide ?"}
C -- Oui --> D["break — sort de la boucle"]
D --> E["Note enregistrée"]
C -- Non --> F["Afficher l'erreur"]
F --> A
Ici, la saisie est dupliquée, car la vérification est fait avant l’exécution du corps de la boucle.
note = float(input("Note (0 à 100) : "))
while note < 0 or note > 100: print("Erreur !") note = float(input("Note (0 à 100) : "))Ici, la saisie n’apparaît qu’une seule fois, car le corps de la boucle est exécuté avant la vérification.
while True: note = float(input("Note (0 à 100) : ")) if note >= 0 and note <= 100: break print("Erreur !")Si la condition du while ne devient jamais False, le programme tourne indéfiniment :
Ici la boucle tourne à l’infinie, car x est toujours positif.
x = 1while x > 0: print(x) x = x + 1 # x ne fera qu'augmenter → toujours > 0Dans cet exemple, on a oublié d’incrémenter le compteur, restant piéger dans la boucle.
compteur = 1while compteur <= 10: print(compteur) # Oups ! On a oublié compteur = compteur + 1 # compteur reste à 1 → boucle infinieParadoxalement, une boucle infinie peut être intentionnelle. Beaucoup de programmes réels fonctionnent comme une boucle qui ne s’arrête que sous certaines conditions :
# Boucle principale d'un programme interactifwhile True: commande = input("> ")
if commande == "quitter": print("Au revoir !") break
print("Tu as tapé :", commande)> bonjourTu as tapé : bonjour> aideTu as tapé : aide> quitterAu revoir !Ce patron est très courant : la boucle tourne indéfiniment, et c’est l’instruction break à l’intérieur qui décide quand s’arrêter.
D’autres exemples de boucles infinies voulues :
# Serveur qui attend des connexions en permanencewhile True: connexion = attendre_connexion() traiter(connexion)
# Boucle de jeu (game loop)while True: lire_entrees() mettre_a_jour() afficher()
# Capteur IoT qui mesure en continuwhile True: temperature = lire_capteur() envoyer_donnees(temperature) attendre(5) # 5 secondesbreak: Sortir de la boucleL’instruction break interrompt immédiatement la boucle et passe à l’instruction qui suit le while.
Le reste du bloc est ignoré et la condition n’est pas réévaluée.
nombre = int(input("Nombre : "))diviseur = 2
while diviseur <= nombre: if nombre % diviseur == 0: print("Le plus petit diviseur (autre que 1) est :", diviseur) break diviseur = diviseur + 1Nombre : 15Le plus petit diviseur (autre que 1) est : 3Dès que le if est vrai, break sort de la boucle. Pas besoin de continuer à tester les diviseurs suivants.
flowchart TD
A["diviseur = 2"] --> B{"diviseur <= nombre ?"}
B -- Non --> F["Fin"]
B -- Oui --> C{"nombre % diviseur == 0 ?"}
C -- Oui --> D["Afficher le diviseur"]
D --> E["break"]
E --> F
C -- Non --> G["diviseur = diviseur + 1"]
G --> B
breakprint("=== MENU ===")print("1. Dire bonjour")print("2. Afficher la date")print("3. Quitter")
while True: choix = input("Ton choix : ")
match choix: case "1": nom = input("Ton nom : ") print("Bonjour", nom, "!") case "2": print("Nous sommes en 2025.") case "3": print("Au revoir !") break case _: print("Choix invalide, réessaie.")Le programme affiche le menu, puis boucle indéfiniment. Seul le choix "3" déclenche le break qui met fin au programme.
continue: Passer à l’itération suivanteL’instruction continue saute le reste du bloc et retourne immédiatement au test de la condition pour l’itération suivante. Contrairement à break, elle ne sort pas de la boucle.
i = 0
while i < 10: i = i + 1
if i % 3 == 0: continue # Saute les multiples de 3
print(i)12457810Les multiples de 3 (3, 6, 9) sont ignorés : quand continue est atteint, le print(i) est sauté et la boucle passe directement à l’itération suivante.
flowchart TD
A["i = 0"] --> B{"i < 10 ?"}
B -- Non --> G["Fin"]
B -- Oui --> C["i = i + 1"]
C --> D{"i est multiple<br/>de 3 ?"}
D -- Oui --> E["continue"]
E --> B
D -- Non --> F["Afficher i"]
F --> B
print("Entre 3 noms (ignore les entrées vides) :")
compteur = 0
while compteur < 3: nom = input("Nom : ")
if nom == "": print(" → Entrée vide, réessaie.") continue
compteur = compteur + 1 print(" →", nom, "enregistré (", compteur, "/ 3 )")
print("Terminé !")Entre 3 noms (ignore les entrées vides) :Nom : Alice → Alice enregistré ( 1 / 3 )Nom : → Entrée vide, réessaie.Nom : Bob → Bob enregistré ( 2 / 3 )Nom : Charlie → Charlie enregistré ( 3 / 3 )Terminé !Quand l’utilisateur entre une chaîne vide, continue revient au début de la boucle sans incrémenter le compteur. L’entrée vide « ne compte pas ».
break vs continueflowchart LR
subgraph "break"
direction TB
A{"condition"} -- Oui --> B["instructions"]
B --> C{"break ?"}
C -- Oui --> D["Sort de la boucle ↓"]
C -- Non --> A
end
subgraph "continue"
direction TB
E{"condition"} -- Oui --> F["instructions"]
F --> G{"continue ?"}
G -- Oui --> E
G -- Non --> H["reste du bloc"]
H --> E
end
| Instruction | Effet | Analogie |
|---|---|---|
break | Sort de la boucle immédiatement | Quitter le manège en plein tour |
continue | Saute au prochain tour de boucle | Sauter une chanson dans une playlist |
else d’un while (bonus)Python offre une syntaxe peu connue : un else après un while. Le bloc else s’exécute seulement si la boucle s’est terminée normalement (sans break).
nombre = int(input("Nombre : "))diviseur = 2
while diviseur < nombre: if nombre % diviseur == 0: print(nombre, "n'est pas premier (divisible par", diviseur, ")") break diviseur = diviseur + 1else: print(nombre, "est un nombre premier")Nombre : 77 est un nombre premierNombre : 1515 n'est pas premier (divisible par 3)Si la boucle se termine parce que diviseur a dépassé nombre (aucun diviseur trouvé),
le else s’exécute → le nombre est premier. Si un break interrompt la boucle (un diviseur a été trouvé), le else est ignoré.
Mettons tout ensemble dans un petit jeu. L’ordinateur choisit un nombre secret et le joueur doit le deviner.
=== JEU DE DEVINETTES ===Je pense à un nombre entre 1 et 100.Tu dois le deviner !
Ta proposition : 50Trop grand !Ta proposition : 25Trop petit !Ta proposition : 37Trop petit !Ta proposition : 43Trop grand !Ta proposition : 40Bravo ! Tu as trouvé 40 en 5 tentatives !Bien joué !flowchart TD
subgraph "while condition:"
direction TB
A{"condition"} -- Vrai --> B["bloc"]
B --> A
A -- Faux --> C["suite"]
end
subgraph "while True: ... break"
direction TB
D["bloc"] --> E{"sortir ?"}
E -- Oui / break --> F["suite"]
E -- Non --> D
end
| Patron | Usage | Nombre minimum d’exécutions |
|---|---|---|
while condition: | La condition est connue avant | 0 (peut ne jamais exécuter) |
while True: + break | Le bloc doit s’exécuter au moins une fois | 1 |
| Instruction | Effet dans une boucle |
|---|---|
break | Sort immédiatement de la boucle |
continue | Saute au prochain tour de boucle |
else (sur while) | S’exécute si la boucle finit sans break |
whilecompteur = 1 # 1. Initialisation
while compteur <= 10: # 2. Condition print(compteur) compteur += 1 # 3. ProgressionSi tu oublies l’une de ces trois composantes, ta boucle ne fonctionnera pas correctement (ou ne s’arrêtera jamais).
| Piège | Conséquence | Solution |
|---|---|---|
| Oublier la progression | Boucle infinie | Toujours modifier la variable de contrôle |
| Condition jamais fausse | Boucle infinie | Vérifier que la progression mène vers False |
| Condition fausse dès le départ | Bloc jamais exécuté | Utiliser while True + break si nécessaire |
break hors d’une boucle | SyntaxError | break et continue uniquement dans un while (ou for) |
forLe while est puissant et polyvalent, mais pour certains cas — comme parcourir une séquence connue à l’avance — Python offre une boucle plus concise : le for.
# Afficher les nombres de 1 à 5i = 1while i <= 5: print(i) i = i + 1# Afficher les nombres de 1 à 5for i in range(1, 6): print(i)Le for élimine le besoin d’initialiser et d’incrémenter manuellement la variable. Tu le découvriras en détail dans la prochaine leçon. En attendant, retiens cette règle :
Utilise while quand…
Tu ne sais pas à l’avance combien de fois boucler (saisie utilisateur, recherche, simulation, etc.)
Utilise for quand…
Tu sais exactement combien de fois boucler ou tu parcours une séquence connue (liste, plage de nombres, etc.)