Tutoriels gratuits et ouverts à toutes et à tous · conçus au Lycée Chevrollier — AngersÀ propos

Série « Parcours Python » · partie 4 / 8

Python niveau 3 — Répéter

Les boucles while et for : laisser l’ordinateur faire le travail répétitif : niveau 3 du parcours Python, avec exercices corrigés et QCM.

Développement✎ B. Jousseaume📅 17 octobre 2026⏱ 5 à 6 h📶 Intermédiaire

1. La boucle while

while signifie « tant que ». Le bloc indenté est répété tant que la condition est vraie.

compteur = 1
while compteur <= 5:
    print(f"Tour n°{compteur}")
    compteur = compteur + 1      # s'écrit aussi : compteur += 1
print("Terminé")

Déroulé : compteur vaut 1, la condition est vraie, on affiche et on passe à 2… Quand compteur vaut 6, la condition devient fausse : on sort de la boucle.

Cas typique : redemander tant que la saisie est incorrecte

note = float(input("Note (0 à 20) : "))
while note < 0 or note > 20:
    print("Note invalide.")
    note = float(input("Note (0 à 20) : "))
print(f"Note enregistrée : {note}")

2. La boucle for et range()

Quand on sait combien de fois répéter, for est plus simple. range(n) produit les nombres de 0 à n-1.

for i in range(5):
    print(i)
→ 0  1  2  3  4    (un par ligne)
ÉcritureNombres produitsUsage
range(5)0, 1, 2, 3, 45 répétitions
range(1, 6)1, 2, 3, 4, 5Début inclus, fin exclue
range(0, 20, 5)0, 5, 10, 15Avec un pas de 5
range(10, 0, -1)10, 9, … , 1Compte à rebours

for sait aussi parcourir un texte, caractère par caractère :

for lettre in "Python":
    print(lettre)

3. Compteur et accumulateur

Deux motifs reviennent sans arrêt en programmation :

  • le compteur : une variable initialisée à 0 à laquelle on ajoute 1 à chaque fois qu’un événement se produit ;
  • l’accumulateur : une variable initialisée à 0 (ou à une valeur neutre) à laquelle on ajoute une valeur à chaque tour, pour calculer un total.
total = 0          # accumulateur
nb_notes = 0       # compteur
for i in range(4):
    note = float(input(f"Note {i + 1} : "))
    total += note
    nb_notes += 1
print(f"Moyenne : {total / nb_notes:.2f}")

4. Contrôler une boucle : break

break interrompt immédiatement la boucle. On l’utilise souvent avec while True, une boucle volontairement infinie dont on sort au bon moment :

while True:
    reponse = input("Tape 'q' pour quitter : ")
    if reponse == "q":
        break
    print(f"Tu as tapé : {reponse}")
print("Au revoir !")

Il existe aussi continue, qui passe directement au tour suivant. Utilise ces instructions avec modération : une condition de boucle claire est souvent plus lisible.

5. Le hasard : module random

Python possède des modules : des boîtes à outils prêtes à l’emploi. On les charge avec import.

import random

de = random.randint(1, 6)            # entier entre 1 et 6 inclus
print(f"Le dé affiche {de}")
couleur = random.choice(["rouge", "vert", "bleu"])
print(couleur)

6. Boucles imbriquées

Une boucle peut en contenir une autre. La boucle intérieure fait tous ses tours pour chaque tour de la boucle extérieure :

for ligne in range(1, 4):
    for colonne in range(1, 4):
        print(ligne * colonne, end="\t")   # end="\t" : tabulation au lieu d'un retour à la ligne
    print()                                  # retour à la ligne
→ 1   2   3
→ 2   4   6
→ 3   6   9

7. Mini-projet : le distributeur de billets en Python

8. Bilan

Exercices corrigés

Les boucles sont la notion où les débutants bloquent le plus. Si ton programme ne fonctionne pas, déroule-le à la main comme au niveau 0, ou utilise le mode pas à pas de Thonny (icône du scarabée, puis F7) pour voir les variables évoluer.

Exercice 3.1 — Échauffement

Voir le corrigé
for i in range(1, 11):
    print(f"7 x {i} = {7 * i}")

n = int(input("n ? "))
for i in range(n, -1, -1):
    print(i)
print("Décollage !")

for i in range(0, 51, 2):
    print(i)

Explication

range(1, 11) va de 1 à 10 car la fin est exclue. Pour le compte à rebours, le pas -1 fait descendre, et la fin -1 permet d’inclure 0. Pour les pairs, le pas de 2 évite même d’avoir à tester la parité.

Pour aller plus loin

# Variante des pairs avec un test (moins efficace, mais utile à comprendre)
for i in range(51):
    if i % 2 == 0:
        print(i)

Exercice 3.2 — Accumuler

Voir le corrigé
# 1. Somme de 1 à 100
somme = 0
for i in range(1, 101):
    somme += i
print(somme)

# 2. Total des achats
total = 0
nb = 0
prix = float(input("Prix (0 pour finir) : "))
while prix != 0:
    total += prix
    nb += 1
    prix = float(input("Prix (0 pour finir) : "))
print(f"{nb} article(s), total : {total:.2f} €")

# 3. Voyelles
mot = input("Un mot : ").lower()
nb_voyelles = 0
for lettre in mot:
    if lettre in "aeiouy":
        nb_voyelles += 1
print(f"{nb_voyelles} voyelle(s)")

Explication

Les trois exercices utilisent le motif initialiser avant la boucle / mettre à jour dans la boucle / exploiter après la boucle. Dans le 2, la saisie est faite une première fois avant le while, puis à la fin de chaque tour : c’est la structure classique d’une saisie avec valeur d’arrêt (la « sentinelle »).

Pour aller plus loin

# Variante du 2 avec while True et break
total, nb = 0, 0
while True:
    prix = float(input("Prix (0 pour finir) : "))
    if prix == 0:
        break
    total += prix
    nb += 1

Exercice 3.3 — Le juste prix

Voir le corrigé
import random

secret = random.randint(1, 100)
essais = 0
proposition = 0
while proposition != secret:
    proposition = int(input("Ta proposition : "))
    essais += 1
    if proposition < secret:
        print("Plus grand")
    elif proposition > secret:
        print("Plus petit")
print(f"Gagné en {essais} essais !")

Bonus : en proposant toujours le milieu de l’intervalle restant, on divise les possibilités par 2 à chaque essai : 100 → 50 → 25 → 13 → 7 → 4 → 2 → 1. Sept essais suffisent. C’est la recherche dichotomique.

Explication

proposition est initialisée à 0 (une valeur impossible) pour pouvoir entrer dans la boucle. Le compteur essais augmente à chaque proposition, y compris la bonne.

Pour aller plus loin

# Bonus : limite à 7 essais
import random
secret = random.randint(1, 100)
for essai in range(1, 8):
    prop = int(input(f"Essai {essai}/7 : "))
    if prop == secret:
        print(f"Gagné en {essai} essais !")
        break
    print("Plus grand" if prop < secret else "Plus petit")
else:              # si la boucle n'a pas été interrompue
    print(f"Perdu, c'était {secret}")

Le else d’une boucle for est peu connu : il s’exécute seulement si la boucle s’est terminée sans break.

Exercice 3.4 — Dessiner

Voir le corrigé
h = int(input("Hauteur : "))
for i in range(1, h + 1):
    print("*" * i)

Explication

La répétition de chaînes "" i évite une boucle imbriquée. La version avec deux boucles est pourtant un bon exercice pour comprendre l’imbrication.

Pour aller plus loin

# Version avec boucles imbriquées
h = int(input("Hauteur : "))
for i in range(1, h + 1):
    for j in range(i):
        print("*", end="")
    print()

# Défi : triangle centré (sapin)
for i in range(1, h + 1):
    print(" " * (h - i) + "*" * (2 * i - 1))

Mini-projet

Voir le corrigé
solde = 500
CODE = "1234"       # uniquement pour l'exercice

essais = 0
connecte = False
while essais < 3 and not connecte:
    if input("Code : ") == CODE:
        connecte = True
    else:
        essais += 1
        print(f"Code faux ({3 - essais} essai(s) restant(s))")

if not connecte:
    print("Carte avalée.")
else:
    while True:
        choix = input("1. Solde  2. Retrait  3. Quitter > ")
        if choix == "1":
            print(f"Solde : {solde} €")
        elif choix == "2":
            montant = int(input("Montant : "))
            if montant <= 0 or montant % 10 != 0:
                print("Montant invalide (multiple de 10).")
            elif montant > solde:
                print("Solde insuffisant.")
            else:
                solde -= montant
                print(f"Retirez vos billets. Nouveau solde : {solde} €")
        elif choix == "3":
            print("Au revoir.")
            break
        else:
            print("Choix inconnu.")

Explication

Le programme a deux phases : authentification (boucle limitée à 3) puis menu (boucle infinie quittée par break). La constante CODE est écrite en majuscules : c’est la convention Python pour une valeur qui ne change pas.

🧠 Testez vos connaissances

5 questions. Répondez puis cliquez sur « Corriger ». Rien n’est enregistré : c’est de l’auto-évaluation.

1. Quels nombres produit range(1, 6) ?

💬 Le début est inclus, la fin est exclue.

2. Quand choisir while plutôt que for ?

💬 for pour un nombre connu de répétitions, while pour répéter jusqu’à ce qu’un événement se produise.

3. Qu’est-ce qui provoque une boucle infinie ?

💬 Il manque souvent la mise à jour du compteur dans la boucle.

4. Où faut-il initialiser un accumulateur total = 0 ?

💬 À l’intérieur, il serait remis à zéro à chaque tour.

5. Pourquoi limiter le nombre d’essais lors d’une saisie de code secret ?

💬 Un code à 4 chiffres n’a que 10 000 combinaisons : une boucle les teste en une seconde.

© 2026 Bruno Jousseaume. Ce cours est publié sous licence CC BY-NC-SA 4.0 : vous pouvez le partager et l’adapter en citant l’auteur et un lien vers cette page, sans usage commercial, et en partageant vos adaptations sous la même licence.

Pour aller plus loin