05 - Boucles

Pourquoi les boucles ?

En programmation, on a souvent besoin de répéter une action : afficher les éléments d’une liste, calculer une somme, traiter chaque ligne d’un fichier, etc. Écrire manuellement chaque instruction serait fastidieux et peu flexible. Les boucles permettent de répéter un bloc d’instructions autant de fois que nécessaire.

Python propose deux types de boucles : la boucle for (quand on connaît le nombre de répétitions) et la boucle while (quand on répète tant qu’une condition est vérifiée).

La boucle for

Parcourir une séquence

La boucle for parcourt les éléments d’une séquence (liste, chaîne, tuple, etc.) un par un :

jours = ["lundi", "mardi", "mercredi", "jeudi", "vendredi"]

for jour in jours:
    print(f"Aujourd'hui c'est {jour}")
Aujourd'hui c'est lundi
Aujourd'hui c'est mardi
Aujourd'hui c'est mercredi
Aujourd'hui c'est jeudi
Aujourd'hui c'est vendredi

À chaque tour de boucle, la variable jour prend la valeur de l’élément suivant de la liste.

Parcourir une chaîne de caractères

mot = "NSI"
for lettre in mot:
    print(lettre, end=" ")
N S I

La fonction range()

La fonction range() génère une séquence de nombres entiers. Elle est très utilisée avec la boucle for :

# range(n) : de 0 à n-1
for i in range(5):
    print(i, end=" ")
0 1 2 3 4
# range(début, fin) : de début à fin-1
for i in range(2, 7):
    print(i, end=" ")
2 3 4 5 6
# range(début, fin, pas) : de début à fin-1, par pas
for i in range(0, 20, 5):
    print(i, end=" ")
0 5 10 15

Attention : comme pour le slicing, la borne de fin est exclue.

Parcours par indice

On peut combiner range() et len() pour parcourir une séquence par ses indices :

fruits = ["pomme", "banane", "cerise"]

for i in range(len(fruits)):
    print(f"Fruit n°{i} : {fruits[i]}")
Fruit n°0 : pomme
Fruit n°1 : banane
Fruit n°2 : cerise

Parcours avec enumerate()

La fonction enumerate() fournit à la fois l’indice et l’élément, ce qui est plus élégant :

fruits = ["pomme", "banane", "cerise"]

for i, fruit in enumerate(fruits):
    print(f"Fruit n°{i} : {fruit}")
Fruit n°0 : pomme
Fruit n°1 : banane
Fruit n°2 : cerise

Accumuler un résultat

Un schéma très courant consiste à initialiser une variable (un accumulateur) puis à la modifier à chaque tour de boucle :

# Calculer la somme des nombres de 1 à 5
total = 0
for i in range(1, 6):
    total += i
print(f"La somme vaut {total}")
La somme vaut 15

Trace d’exécution. Pour bien comprendre, suivons les valeurs des variables à chaque tour de boucle :

Touritotal avanttotal += itotal après
1100 + 11
2211 + 23
3333 + 36
4466 + 410
551010 + 515

Ce tableau s’appelle une trace d’exécution (ou table de trace). C’est un outil essentiel pour comprendre et vérifier le comportement d’un programme.

# Construire une chaîne lettre par lettre
mot = "Python"
resultat = ""
for lettre in mot:
    resultat += lettre + "-"
print(resultat)
P-y-t-h-o-n-

La boucle while

Principe

La boucle while répète un bloc d’instructions tant qu’une condition est vraie :

compteur = 1
while compteur <= 5:
    print(compteur)
    compteur += 1
1
2
3
4
5

Trace d’exécution :

Tourcompteurcompteur <= 5 ?Actioncompteur après
11Vraiaffiche 12
22Vraiaffiche 23
33Vraiaffiche 34
44Vraiaffiche 45
55Vraiaffiche 56
6Fauxsortie de boucle

Attention : si la condition ne devient jamais fausse, la boucle tourne indéfiniment (boucle infinie). Il faut toujours s’assurer que quelque chose dans le corps de la boucle finira par rendre la condition fausse.

Quand utiliser while plutôt que for ?

On utilise while lorsqu’on ne sait pas à l’avance combien de fois la boucle va s’exécuter :

# Demander un mot de passe jusqu'à obtenir le bon
mot_de_passe = ""
while mot_de_passe != "nsi2026":
    mot_de_passe = input("Mot de passe : ")
print("Accès autorisé !")
# Trouver la plus petite puissance de 2 supérieure à 1000
puissance = 1
while puissance <= 1000:
    puissance *= 2
print(puissance)  # 1024

Simuler un do...while

Python n’a pas de boucle do...while. Pour exécuter le corps au moins une fois, on peut utiliser while True avec break :

while True:
    reponse = input("Entrez un nombre positif : ")
    nombre = int(reponse)
    if nombre > 0:
        break
    print("Erreur : le nombre doit être positif !")
print(f"Vous avez entré {nombre}")

Instructions de contrôle

break : sortir de la boucle

L’instruction break interrompt immédiatement la boucle, même si la condition est encore vraie ou que la séquence n’est pas terminée :

# Chercher la première voyelle dans un mot
mot = "python"
for lettre in mot:
    if lettre in "aeiouy":
        print(f"Première voyelle : {lettre}")
        break
Première voyelle : y

continue : passer au tour suivant

L’instruction continue saute le reste du bloc et passe directement au tour suivant :

# Afficher uniquement les nombres impairs de 1 à 10
for i in range(1, 11):
    if i % 2 == 0:
        continue
    print(i, end=" ")
1 3 5 7 9

Boucles imbriquées

On peut placer une boucle à l’intérieur d’une autre boucle. La boucle intérieure s’exécute entièrement à chaque tour de la boucle extérieure :

for i in range(1, 4):
    for j in range(1, 4):
        print(f"{i} × {j} = {i*j}", end="   ")
    print()  # retour à la ligne
1 × 1 = 1   1 × 2 = 2   1 × 3 = 3
2 × 1 = 2   2 × 2 = 4   2 × 3 = 6
3 × 1 = 3   3 × 2 = 6   3 × 3 = 9

Autre exemple : parcourir une matrice (liste de listes) :

matrice = [[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]]

for ligne in matrice:
    for element in ligne:
        print(element, end=" ")
    print()
1 2 3
4 5 6
7 8 9

Le piège de la boucle infinie

Une boucle infinie est une boucle dont la condition ne devient jamais fausse. Le programme tourne alors indéfiniment et il faut l’interrompre manuellement (Ctrl+C dans le terminal, ou bouton Stop dans l’éditeur).

# NE PAS EXÉCUTER : boucle infinie !
n = 1
while n <= 5:
    print(n)
    # Oubli : n n'est jamais incrémenté, donc n reste à 1
    # La condition n <= 5 est toujours vraie → boucle infinie

La trace montre le problème :

Tournn <= 5 ?Action
11Vraiaffiche 1, n ne change pas
21Vraiaffiche 1, n ne change pas
31Vraiaffiche 1, n ne change pas
1Vraiindéfiniment

La correction est simple : il faut ajouter n += 1 dans le corps de la boucle.

Erreurs fréquentes

Modifier la variable de boucle dans un for : la modification n’a aucun effet sur le parcours.

for i in range(5):
    i = 100       # sans effet : i reprendra la valeur suivante au prochain tour
    print(i)      # affiche 100 à chaque tour, mais ne change rien au parcours

Erreur de borne dans range() : range(1, 5) va de 1 à 4, pas de 1 à 5. Pour aller de 1 à 5, il faut écrire range(1, 6).

Modifier une liste en la parcourant : cela peut produire des résultats imprévisibles. Il vaut mieux construire une nouvelle liste.

Résumé

ConceptSyntaxeUsage
forfor x in sequence:Nombre de tours connu
whilewhile condition:Nombre de tours inconnu
range()range(début, fin, pas)Générer des entiers
enumerate()for i, x in enumerate(L):Indice et élément
breakbreakSortir de la boucle
continuecontinuePasser au tour suivant