Skip to main content
Niveau : Débutant

Chapitre 9 : La Boucle while

Boucle infinie, break, continue, input, else

1. Quoi : La Boucle while

La boucle while (qui signifie "tant que") exécute un bloc de code de manière répétée tant qu'une condition spécifiée reste vraie.

Contrairement à la boucle for qui itère sur une séquence finie, la boucle while est utilisée lorsque le nombre d'itérations n'est pas connu à l'avance.

2. Pourquoi : Gérer les conditions indéterminées

La boucle while est idéale pour des scénarios comme :

  • Attendre une entrée utilisateur valide.
  • Exécuter un programme jusqu'à ce que l'utilisateur décide de quitter.
  • Traiter des données provenant d'une source en temps réel (ex: un flux réseau) jusqu'à ce qu'un signal d'arrêt soit reçu.
  • Implémenter des algorithmes où la condition d'arrêt dépend du résultat des calculs précédents.

3. Comment : La Syntaxe

La syntaxe de base est : while <condition>:

# On initialise une variable de contrôle AVANT la boucle.
count = 0

# La boucle continuera tant que 'count' est inférieur à 5.
while count < 5:
print(f"Current count: {count}")
# ⚠️ Très important : On doit modifier la variable de contrôle
# à l'intérieur de la boucle pour éviter une boucle infinie.
count += 1

print("Loop finished.")

Sortie :

Current count: 0
Current count: 1
Current count: 2
Current count: 3
Current count: 4
Loop finished.

Le Piège de la Boucle Infinie

Si la condition de la boucle while ne devient jamais False, la boucle s'exécutera pour toujours. C'est une erreur courante.

# ❌ Mauvais : Boucle infinie !
# 'is_running' est toujours True, la condition ne change jamais.
is_running = True
while is_running:
print("Running...")

Pour arrêter une boucle infinie dans votre terminal, vous devez généralement utiliser Ctrl+C.

Utilisation de break et continue

Les instructions break et continue fonctionnent de la même manière que dans une boucle for.

  • break : Sort immédiatement de la boucle while.
  • continue : Saute le reste de l'itération actuelle et retourne à la vérification de la condition while.

break est souvent utilisé pour créer une "boucle infinie contrôlée", ce qui est un modèle de conception courant.

# Modèle de boucle "infinie contrôlée"
while True: # Crée une boucle qui s'exécute pour toujours...
user_input = input("Enter a command (or 'quit' to exit): ")

if user_input == "quit":
print("Exiting program.")
break # ...jusqu'à ce que cette condition soit remplie.

if user_input == "hello":
print("Hello to you too!")
continue # On a traité la commande, on repart au début de la boucle.

print(f"Unknown command: '{user_input}'")

Le bloc else dans une boucle while

Similaire à la boucle for, le bloc else d'une boucle while s'exécute uniquement si la boucle se termine parce que sa condition est devenue fausse, et non à cause d'un break.

countdown = 5
while countdown > 0:
print(countdown)
countdown -= 1
else:
# Ce bloc s'exécute car la boucle s'est terminée
# naturellement (countdown n'est plus > 0).
print("Liftoff!")

4. for vs while : Quand utiliser quoi ?

  • Utilisez une boucle for quand :

    • Vous avez une séquence existante (liste, chaîne, etc.) à parcourir.
    • Vous savez exactement combien de fois vous voulez que la boucle s'exécute (en utilisant range()).
    • C'est le cas le plus courant en Python.
  • Utilisez une boucle while quand :

    • Vous ne savez pas combien d'itérations seront nécessaires.
    • La condition d'arrêt dépend d'un événement externe (comme une entrée utilisateur) ou d'un état qui change à l'intérieur de la boucle.

Bonne pratique : Préférez toujours une boucle for si vous le pouvez. Elle est généralement plus simple, plus lisible et moins sujette aux erreurs de boucles infinies.

Exercices :

Exercice 9 - Le Jeu du Juste Prix

Objectif

Cet exercice a pour but de vous faire utiliser une boucle while pour créer un petit jeu interactif où l'utilisateur doit deviner un nombre secret.

Contexte

Vous allez programmer un jeu simple :

  1. Le programme choisit un nombre secret.
  2. L'utilisateur a un nombre limité de tentatives pour deviner ce nombre.
  3. Après chaque tentative, le programme indique si le nombre à deviner est plus grand ou plus petit.
  4. La partie se termine si l'utilisateur trouve le nombre ou s'il n'a plus de tentatives.

Énoncé

  1. Créez un nouveau fichier Python nommé guessing_game.py.

  2. Initialisez les variables du jeu :

    secret_number = 42
    max_attempts = 5
    current_attempt = 0
  3. Écrivez une boucle while qui continue tant que l'utilisateur a encore des tentatives (current_attempt < max_attempts).

  4. À l'intérieur de la boucle : a. Incrémentez current_attempt de 1. b. Utilisez la fonction input() pour demander à l'utilisateur de deviner un nombre. Affichez le numéro de la tentative actuelle. - Astuce : input() retourne toujours une chaîne de caractères. Vous devrez la convertir en nombre entier avec int(). c. Utilisez une structure if/elif/else pour comparer la devinette de l'utilisateur (guess) avec le secret_number : - Si guess est plus petit que secret_number, affichez "Too low!". - Si guess est plus grand que secret_number, affichez "Too high!". - Si guess est égal à secret_number, affichez un message de victoire et arrêtez la boucle avec break.

  5. Après la boucle, ajoutez une condition pour vérifier si le joueur a gagné ou perdu.

    • Si le joueur a trouvé le bon nombre, il a déjà reçu son message de victoire.
    • Si la boucle s'est terminée parce que le nombre maximum de tentatives a été atteint, affichez un message de défaite révélant le nombre secret.
    • Astuce : Vous pouvez utiliser une variable "drapeau" (flag) ou simplement vérifier si le nombre de tentatives a atteint le maximum.

Résultat Attendu

Voici un exemple de partie où l'utilisateur gagne :

--- Guessing Game ---
Attempt 1/5 - Enter your guess: 50
Too high!
Attempt 2/5 - Enter your guess: 25
Too low!
Attempt 3/5 - Enter your guess: 40
Too low!
Attempt 4/5 - Enter your guess: 42
Congratulations! You found the secret number 42 in 4 attempts!

Voici un exemple de partie où l'utilisateur perd :

--- Guessing Game ---
Attempt 1/5 - Enter your guess: 1
Too low!
Attempt 2/5 - Enter your guess: 2
Too low!
Attempt 3/5 - Enter your guess: 3
Too low!
Attempt 4/5 - Enter your guess: 4
Too low!
Attempt 5/5 - Enter your guess: 5
Too low!
Sorry, you've run out of attempts. The secret number was 42.
Cliquez ici pour voir un exemple de code de solution
# guessing_game.py

secret_number = 42
max_attempts = 5
current_attempt = 0
has_won = False # Variable "drapeau" pour savoir si le joueur a gagné

print("--- Guessing Game ---")

while current_attempt < max_attempts:
current_attempt += 1

# Demande à l'utilisateur et convertit l'entrée en entier
guess_str = input(f"Attempt {current_attempt}/{max_attempts} - Enter your guess: ")
guess = int(guess_str)

# Compare la devinette au nombre secret
if guess < secret_number:
print("Too low!")
elif guess > secret_number:
print("Too high!")
else: # guess == secret_number
print(f"Congratulations! You found the secret number {secret_number} in {current_attempt} attempts!")
has_won = True
break # Sort de la boucle car le joueur a gagné

# Après la boucle, on vérifie si le joueur n'a PAS gagné
if not has_won:
print(f"Sorry, you've run out of attempts. The secret number was {secret_number}.")