cours1 min de lecture

Boucles bornées et non bornées

Répéter des instructions, soit un nombre de fois connu d'avance (for), soit jusqu'à ce qu'une condition cesse (while).
programme

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 :

⏵ Ctrl+↵ pour exécuter
Aucune exécution pour l'instant.

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 :

ÉcritureValeurs produitesCombien de tours
range(5)0, 1, 2, 3, 45
range(1, 6)1, 2, 3, 4, 55
range(2, 10, 2)2, 4, 6, 84
range(10, 0, -1)10, 9, 8, …, 110

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 :

TourValeur de n avantCondition n < 100 ?Action
11vraien devient 2
22vraien devient 4
34vraien devient 8
48vraien devient 16
516vraien devient 32
632vraien devient 64
764vraien devient 128
8128faussesortir 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 vs non bornée : la différence ne porte pas sur le nombre de tours en lui-même, mais sur le fait qu'on le connaît à l'écriture (bornée) ou qu'il dépend du déroulement (non bornée).

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 :

SituationTypePourquoi
Afficher les nombres de 1 à 100for (bornée)on sait : 100 tours
Répéter une question jusqu'à obtenir une bonne réponsewhile (non bornée)on ne sait pas combien d'essais
Parcourir chaque caractère d'un motfor (bornée)autant de tours que de lettres
Continuer un jeu tant que le joueur a des pointswhile (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)

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
Si vous lancez accidentellement une boucle infinie, le programme ne s'arrête plus tout seul. Sur un éditeur en ligne, fermez l'onglet ou cliquez sur « arrêter ». Vérifiez toujours qu'une variable de la condition change à l'intérieur du bloc.

Exemple complet de while

Un compte à rebours qui s'arrête quand on atteint zéro :

⏵ Ctrl+↵ pour exécuter
Aucune exécution pour l'instant.

À 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) produit n valeurs de 0 à n-1, pas de 1 à n. Ne jamais l'oublier.
  • Modifier i dans une boucle for est 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 while change 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.