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 bouclewhile.continue: Saute le reste de l'itération actuelle et retourne à la vérification de la conditionwhile.
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
forquand :- 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
whilequand :- 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 :
- Le programme choisit un nombre secret.
- L'utilisateur a un nombre limité de tentatives pour deviner ce nombre.
- Après chaque tentative, le programme indique si le nombre à deviner est plus grand ou plus petit.
- La partie se termine si l'utilisateur trouve le nombre ou s'il n'a plus de tentatives.
Énoncé
-
Créez un nouveau fichier Python nommé
guessing_game.py. -
Initialisez les variables du jeu :
secret_number = 42
max_attempts = 5
current_attempt = 0 -
Écrivez une boucle
whilequi continue tant que l'utilisateur a encore des tentatives (current_attempt < max_attempts). -
À l'intérieur de la boucle : a. Incrémentez
current_attemptde 1. b. Utilisez la fonctioninput()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 avecint(). c. Utilisez une structureif/elif/elsepour comparer la devinette de l'utilisateur (guess) avec lesecret_number: - Siguessest plus petit quesecret_number, affichez "Too low!". - Siguessest plus grand quesecret_number, affichez "Too high!". - Siguessest égal àsecret_number, affichez un message de victoire et arrêtez la boucle avecbreak. -
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}.")