Boucles bornées et non bornées
Introduction
Imaginez devoir afficher « Bonjour » dix fois. Avec ce que vous savez, il
faudrait écrire dix lignes de print. Pour cent fois, ce serait absurde. Les
ordinateurs sont conçus pour répéter rapidement et sans erreur — c'est même
l'une des choses qu'ils font le mieux.
L'instruction qui dit « recommence ce bloc plusieurs fois » s'appelle une
boucle. Python en propose deux : for, quand on sait à l'avance combien
de répétitions on veut, et while, quand on veut continuer tant qu'une
condition reste vraie.
La boucle for — bornée
Une boucle est dite bornée quand le nombre de tours est fixé d'avance.
En Python, on l'écrit avec for et la fonction range :
for i in range(5):
print("Bonjour")
Ce programme affiche cinq fois la même chose :
Bonjour
Bonjour
Bonjour
Bonjour
Bonjour
Lecture : « pour chaque valeur i prise dans range(5), exécuter le bloc ».
À chaque tour, la variable i prend la valeur suivante : 0, 1, 2, 3, 4.
range(5) produit 0, 1, 2, 3, 4 — c'est-à-dire cinq valeurs, mais
qui s'arrêtent avant 5. La borne supérieure n'est jamais atteinte. C'est
un piège classique à mémoriser une bonne fois pour toutes.Utiliser la variable de boucle
La variable i (ou tout autre nom que vous choisissez) peut être utilisée
à l'intérieur de la boucle :
Affichage :
Tour numéro 0
Tour numéro 1
Tour numéro 2
Tour numéro 3
Tour numéro 4
Cela rend les boucles bien plus puissantes que de simples répétitions identiques.
Varier range
range accepte plusieurs formes :
| Écriture | Valeurs produites | Combien de tours |
|---|---|---|
range(5) | 0, 1, 2, 3, 4 | 5 |
range(1, 6) | 1, 2, 3, 4, 5 | 5 |
range(2, 10, 2) | 2, 4, 6, 8 | 4 |
range(10, 0, -1) | 10, 9, 8, …, 1 | 10 |
Avec deux arguments, c'est range(début, fin) — toujours, la borne fin est
exclue. Avec trois arguments, le dernier est le pas.
Combien de tours dans for i in range(3, 8): ?
La boucle while — non bornée
Parfois, on ne sait pas à l'avance combien de tours seront nécessaires —
seulement la condition qui doit rester vraie pour continuer. C'est le rôle
de while :
n = 1
while n < 100:
n = n * 2
print(n)
Lecture : « tant que n < 100, faire n = n * 2 ». Python recommence le
bloc tant que la condition est vraie. Déroulons :
| Tour | Valeur de n avant | Condition n < 100 ? | Action |
|---|---|---|---|
| 1 | 1 | vraie | n devient 2 |
| 2 | 2 | vraie | n devient 4 |
| 3 | 4 | vraie | n devient 8 |
| 4 | 8 | vraie | n devient 16 |
| 5 | 16 | vraie | n devient 32 |
| 6 | 32 | vraie | n devient 64 |
| 7 | 64 | vraie | n devient 128 |
| 8 | 128 | fausse | sortir de la boucle |
Le print(n) final affiche 128. Avant d'écrire cette boucle, on aurait été
incapable de prédire qu'il y aurait exactement 7 tours.
Bornée ou non bornée ? Tableau de décision
Pour chaque situation, on indique le type de boucle approprié, puis on matérialise l'idée par un mini-snippet Python juste après le tableau :
| Situation | Type | Pourquoi |
|---|---|---|
| Afficher les nombres de 1 à 100 | for (bornée) | on sait : 100 tours |
| Répéter une question jusqu'à obtenir une bonne réponse | while (non bornée) | on ne sait pas combien d'essais |
| Parcourir chaque caractère d'un mot | for (bornée) | autant de tours que de lettres |
| Continuer un jeu tant que le joueur a des points | while (non bornée) | dépend des coups joués |
Les snippets correspondants, ligne par ligne :
for ne sert pas qu'avec range. Une chaîne de caractères (comme
"Python") peut elle aussi être parcourue caractère par caractère par un
for : à chaque tour, la variable prend la valeur d'une lettre, dans l'ordre.
On dit qu'une chaîne est parcourable au même titre qu'un range. C'est
ce qu'illustre le 3ᵉ onglet ci-dessous.for i in range(1, 101):
print(i)
# demander() est ici une fonction imaginaire (saisie utilisateur).
reponse = ""
while reponse != "Paris":
reponse = demander()
for lettre in "Python":
print(lettre)
# perdre() est ici une fonction imaginaire (points perdus à ce tour).
points = 100
while points > 0:
points = points - perdre()
Les fonctions demander() et perdre() sont là à titre d'illustration —
ce sont des fonctions imaginaires qui représenteraient une saisie utilisateur
ou un coup perdu. Vous apprendrez à écrire vos propres fonctions au cours
suivant. Pour l'instant, ce qu'il faut voir, c'est la structure de la
boucle : for quand le nombre de tours est connu d'avance, while quand il
dépend de ce qui se passe pendant l'exécution.
Pour compter les voyelles d'un mot donné, quel type de boucle est le plus naturel ?
Le piège mortel : la boucle infinie
Une boucle while doit finir un jour. Pour cela, la condition doit pouvoir
devenir fausse — et donc, quelque chose dans la boucle doit la faire
évoluer. Sinon, le programme tourne indéfiniment.
# DANGER : boucle infinie
n = 1
while n < 100:
print(n)
# rien ne change n... la condition reste vraie pour toujours
Exemple complet de while
Un compte à rebours qui s'arrête quand on atteint zéro :
À chaque tour, nombre diminue de 1. Au tour où nombre vaut 1, la condition
nombre > 0 est encore vraie : on affiche 1, puis nombre devient 0. Le
tour suivant, la condition est fausse : on sort, et le print("Décollage !")
final s'exécute.
Pièges courants
range(n)produitnvaleurs de0àn-1, pas de1àn. Ne jamais l'oublier.- Modifier
idans une boucleforest mal vu : Python le ré-assignera au tour suivant de toute façon. Inutile et trompeur. - Boucle infinie : toujours vérifier qu'une variable de la condition
whilechange dans le bloc. - Indentation : comme pour les
if, le bloc répété est décalé de 4 espaces. Sans indentation, Python refuse de comprendre.
Pour aller plus loin
On peut aussi parcourir directement une chaîne ou une liste :
mot = "Python"
for lettre in mot:
print(lettre)
Cela affiche chaque lettre du mot, une par ligne. C'est encore une boucle bornée (autant de tours que de lettres), juste écrite différemment.