Construction élémentaires III : La boucle while
Objectifs :
À la fin de cette séquence vous serez capable de :
- Utiliser la boucle
whilepour répéter un morceau de programmme. - Manipuler les instructions
breaketcontinue. - (Modifier un algorithme et son pseudo-code)
Un mini-projet
Améliorer notre jeu « nombre à deviner » de sorte que l'on puisse jouer tant que l'on n'a pas la bonne réponse.
1. Mise en œuvre de l'instruction while
1.1. Premier exemple : La baitaille perdue
Un héros courageux affronte une horde de trolls. À chaque tour, il perd 12 points de vie. La bataille s'arrête lorsqu'il n'a plus de points de vie.
Le but n’est pas de survivre, mais de voir jusqu’où le héros pourra aller !
code Python
# Exemple 1 — compteur décroissant
print("Votre héros solitaire est encerclé par une immense armée de trolls.")
print("Leurs corps verdâtres en décomposition s'étendent à perte de vue.")
print("Votre héros dégaine son épée pour le dernier combat de sa vie.\n")
# Mise en place des variables
points_vie = 50
degats = 12
nb_trolls_vaincus = 0
# Créer la boucle de combat
# On répète le combat tant que le héros est encore en vie :
while points_vie > 0:
nb_trolls_vaincus = nb_trolls_vaincus + 1
print(f"nombre de trolls vaincus = {nb_trolls_vaincus}")
print(f"Un nouveau troll apparaît ! Le héros l'affronte et le terrasse !")
print(f"Mais, il perd {degats} points de vie.")
points_vie = points_vie - degats
if points_vie > 0:
print(f"Il lui reste {points_vie} points de vie.\n")
else:
print("Le héros est tombé au combat...\n")
# Fin du combat
print("Le héros est à court de forces. Fin de la bataille.")
print(f"Il a vaincu {nb_trolls_vaincus} troll(s) avant de mourir.")
Fonctionnement de l' instruction while :
- Déterminer si la condition
points_vie > 0est vraie ou fausse. -
Si la condition est vraie, exécuter le corps, puis revenir à l'étape d'initialisation (avec les nouvelles valeurs de
points_vieetnb_trolls_vaincus).
nb_trolls_vaincus = nb_trolls_vaincus + 1 print(f"nombre de trolls vaincus = {nb_trolls_vaincus}") print(f"Un nouveau troll apparaît ! Le héros l'affronte et le terrasse !") print(f"Mais, il perd {degats} points de vie.") points_vie = points_vie - degats if points_vie > 0: print(f"Il lui reste {points_vie} points de vie.\n") else: print("Le héros est tombé au combat...\n") -
Si fausse (c'est-à-dire
points_vie ≤ 0), quitter l'instruction while et poursuivre l'exécution à l'instruction suivante
(print(f"Il a vaincu {nb_trolls_vaincus} troll(s) avant de mourir.")).
Table de suivi de la boucle
| points_vie | nb_trolls_vaincus | dégats | test : points_vie > 0 |
|---|---|---|---|
| 50 | 0 | 12 | True |
| 38 | 1 | 12 | True |
| 26 | 2 | 12 | True |
| 14 | 3 | 12 | True |
| 2 | 4 | 12 | True |
| -10 | 5 | 12 | False |
1.2. Deuxième exemple : Conversation avec un enfant de trois ans !
Un enfant répond toujours « pourquoi ? » jusqu'à ce que l'adulte réponde « parce que ». On boucle tant que la réponse n'est pas « parce que ».
code Python
# Exemple 2 — boucle contrôlée par condition de saisie
reponse = ""
print("L'enfant : Pourquoi ? (répondez et terminez par 'parce que')")
while reponse.lower() != "parce que":
reponse = input("Vous : ")
if reponse == "":
print("(Dites quelque chose...)")
print("L'enfant : D'accord.")
Analyse de la boucle while
La boucle while teste la condition (reponse != "parce que"). Si cette condition (test) est vraie, s'exécute.
reponse = input("Vous : ")
if reponse == "":
print("(Dites quelque chose...)")
À la fin, la condition est réévaluée.
Tant que la condition reste vraie, le corps de la boucle continue de s'exécuter. Dès que la condition est fausse (reponse == "parce que"), la boucle arrête de s'exécuter. Et le programme exécute l'instruction qui suit la boucle (print("L'enfant : D'accord.")).
1.3. Syntaxe de la boucle while :
while test :
<expression n°1>
...
<expression n°n>
# Suite du programme
<instruction si le test est évalué à Faux>
#Après les deux points il y a une indentation (décalage)
#expressionS n°... constituent le corps de la boucle (indenté par rapport à la ligne précédente)

Généralement, une boucle while est contrôlée par une variable (reponse dans notre simulateur) qui est comparée à une ou plusieurs valeurs ("parce que").
Il est important que cette variable de contrôle soit initialisée avant la boucle (reponse = "" dans notre simulateur).
S'assurer que le test peut être évalué à True et à False.
Boucle impossible
Le premier test est évalué à faux.
#Une bouble impossible
n = 0
u = 15
while u < 10:
u = u - 1
print(u)
Boucle infinie : Répéter Indéfiniment
Pour mettre en œuvre une boucle infinie, on utilise en général une boucle « tant que » avec une condition toujours vraie.
#boucle infinie
cpteur = 0
while cpteur >= 0:
cpteur = cpteur + 1
print(cpteur)
#boucle infinie
cpteur = 0
while True:
cpteur = cpteur + 1
print(cpteur)
prenom = ""
while prenom != "Timoléon
prenom = input("Entrer un prénom : ")
print(prenom)
input("Appuyer sur la touche Entrer pour quitter.")
Application 3 :
Associer ces deux programmes en un seul afin que ce dernier détermine aussi le nombre de tentatives pour trouver le prénom Timoléon.
prenom = ""
cpteur = 0
while prenom != "Timoléon":
prenom = input("\nEntrer un prénom : ")
cpteur += 1
print(f"\n{prenom} est votre proposition n° {cpteur}.")
Vérité d'un test
prenom = "Sandrine"
if prenom: Ici prenom est une condition qui est évaluée à True ou False.
La vérité de ce test est True. Elle serait False si prenom était une chaîne vide.
2. Les instructions break et continue
L'instruction break est utile pour sortir immédiatement de la boucle lorsqu'une condition est vérifiée.
prenom = ""
while prenom != "Timoléon":
prenom = input("Entrer un prénom : ")
print(prenom)
if prenom.startswith("B"):
break
while True:
print()
mot_de_passe = input("Choisir un nouveau mot de passe (composé de lettres et/ou de nombres) : ")
if mot_de_passe.isalnum():
print("Vous êtes connecté.")
break
print("Recommencer. Un mot de passe n'est constitué que de lettres et/ou de chiffres.")
L'instruction continue est utilisée pour retourner au début d'une boucle (on abandonne le traitement du reste du corps de la boucle pour l'itération en cours et on passe à la suivante).
# break et continue
i = 0
while True: # boucle potentiellement infinie
i += 1
if i % 2 == 1:
continue # saute les nombres impairs
print(i) # n'affiche que les nombres pairs
if i >= 10:
break # on s'arrête à 10
Les instructions break et continue doivent être utilisées avec parcimonie.
Exercice 1 : Devine mon nombre
#Deviner mon nombre
import random
"""
L'ordinateur choisit un entier entre 1 et 100,
Le joueur doit le deviner en une seule tentative. Et la machine signale à ce dernier
si sa proposition est trop grande, trop petite ou la bonne.
"""
print("Bienvenue sur le jeu : Devinez mon nombre !")
print("\nJe pense à un entier compris entre 1 et 100.")
print("\nEssayez de deviner ce nombre.")
#Choisir le nombre à deviner
nbre_secret = random.randint(1, 100)
essai = int(input("Proposer un entier"))
if essai > nbre_secret:
print("\nTrop grand !")
elif essai == nbre_secret:
print(f"\nBravo, vous avez trouvé le bon nombre ! ")
else:
print("\Trop petit !")
On permet de jouer tant que la bonne réponse n'est pas trouvée.
Modifier l'algorithme précédent afin qu'il réponde au problème posé.
Exercice 2 :
Améliorer le jeu de sorte que le programme affiche le nombre de tentatives qu'il a fallu au joueur pour deviner la bonne réponse.
Exercice 3 :
Améliorer notre jeu de sorte que le nombre de tentatives soit limité à 5.
Faites-vous plaisir 1
Description : Ce code cherche à afficher les nombres de 10 à 1, mais plante.
compteur = 10
while compteur > 0:
print(compteur)
compteur += 1 # Augmente au lieu de diminuer
Faites-vous plaisir 2
Description : Ce programme est censé demander un mot de passe jusqu'à ce que l'utilisateur entre "python". Il doit ensuite afficher un message de bienvenue.
# Problème de Débogage
mot_de_passe_correct = "python"
mot_entre = ""
while mot_entre != mot_de_passe_correct:
mot_entre = input("Veuillez entrer le mot de passe : ")
print("Bienvenue !")
Comportement Attendu (si l'utilisateur entre "python") :
Veuillez entrer le mot de passe : mot_incorrect
Veuillez entrer le mot de passe : python
Bienvenue !
Le programme fonctionne mais ne s'arrête jamais si le mot de passe est "python". Identifiez pourquoi et corrigez-le.