La boucle non bornée : while
Pourquoi ? Quand on ne sait pas combien de tours
La boucle for parcourt une séquence finie : on connaît d'avance le nombre de tours. Mais parfois, on ne le connaît pas :
- redemander une saisie tant que l'utilisateur se trompe ;
- continuer une partie tant que personne n'a gagné ;
- avancer dans un calcul tant que ce n'est pas terminé.
Pour cela, on utilise la boucle while : « répéter tant qu'une condition est vraie ».
while : répéter tant que...
Tant que la condition est vraie, le bloc indenté est réexécuté. Dès qu'elle devient fausse, la boucle s'arrête.
Ce que fait la machine, tour par tour
| Avant le tour | i <= 3 ? |
on exécute | après |
|---|---|---|---|
i = 1 |
vrai | affiche 1, i devient 2 |
i = 2 |
i = 2 |
vrai | affiche 2, i devient 3 |
i = 3 |
i = 3 |
vrai | affiche 3, i devient 4 |
i = 4 |
i = 4 |
faux | on sort de la boucle |
Puis Python continue avec « fini ». La condition est testée avant chaque tour.
Les trois rouages : initialisation, condition, mise à jour
Là où le for cache la gestion du compteur (Python s'en occupe), le while vous oblige à écrire vous-même les trois rouages d'une boucle :
i = 1 # 1. INITIALISATION (avant la boucle)
while i <= 3: # 2. CONDITION de continuation
print(i)
i = i + 1 # 3. MISE À JOUR (dans la boucle)
C'est plus de travail, mais c'est aussi ce qui rend le mécanisme visible. Si l'un des trois rouages manque ou est faux, la boucle ne fait pas ce qu'on croit.
Le danger : la boucle infinie
Si la mise à jour ne rapproche jamais la condition du « faux », la boucle ne s'arrête jamais.
Ici i reste à 1, la condition reste vraie, et le programme affiche 1 indéfiniment. Il faut alors l'interrompre à la main (Ctrl+C).
Avant d'écrire un while, posez-vous la question
« Qu'est-ce qui, dans le corps de la boucle, va finir par rendre la condition fausse ? » Si vous ne savez pas répondre, votre boucle risque de tourner à l'infini.
Le variant : ce qui garantit l'arrêt
Une boucle while se termine si une quantité évolue à coup sûr vers la sortie : par exemple un nombre qui diminue strictement à chaque tour et ne peut pas descendre en dessous d'une limite. On appelle cela un variant. On y reviendra en algorithmique, mais l'idée est déjà là : pour être sûr qu'une boucle s'arrête, il faut exhiber ce qui la fait progresser vers sa fin.
for ou while ?
for |
while |
|
|---|---|---|
| Quand | on parcourt une séquence / un nombre connu de tours | on répète tant qu'une condition tient, nombre de tours inconnu |
| Mise à jour | gérée par Python | à écrire soi-même |
| Risque | se termine toujours | boucle infinie possible |
En pratique : si vous pouvez dire « pour chaque élément » ou « n fois », utilisez for. Si vous devez dire « tant que... », utilisez while.
Exercices
1 - Saisie contrôlée
Demandez un nombre entre 1 et 10 à l'utilisateur, en redemandant tant que la valeur saisie est hors de cet intervalle.
2 - Somme jusqu'à un seuil
En partant de 1, additionnez les entiers successifs (1, 2, 3, ...) et affichez combien il en faut pour que la somme dépasse 100.
3 - Deviner un nombre
L'ordinateur choisit un nombre au hasard entre 1 et 100. L'utilisateur propose des valeurs tant qu'il n'a pas trouvé ; à chaque essai, indiquez « plus grand » ou « plus petit ».
4 - PGCD (algorithme d'Euclide)
Le plus grand commun diviseur de a et b s'obtient en remplaçant (a, b) par (b, a % b) tant que b n'est pas nul.