Cours de Python / Répéter une saisie avec while, break et continue
Une boucle while se répète tant que sa condition est vraie. break termine la boucle la plus proche et continue passe à l’itération suivante : chaque chemin doit permettre de mettre à jour l’état ou de rencontrer une sortie.
Choisir une répétition contrôlée par une condition
Une boucle for convient au parcours d’éléments déjà disponibles. Une boucle while convient lorsque la répétition dépend d’un état qui évolue, par exemple des montants saisis jusqu’à une commande de fin. La condition est vérifiée avant chaque tour ; si elle est fausse dès le départ, le corps n’est pas exécuté.
while True n’est pas une erreur en soi : cette forme demande une règle de sortie explicite à l’intérieur. Dans l’exercice, la lettre minuscule q est cette commande. La lecture d’une nouvelle ligne au début de chaque tour permet d’obtenir une nouvelle saisie même après un continue.
En revanche, si une mise à jour de compteur se trouve uniquement après un continue, un chemin peut la sauter à chaque tour. Une boucle qui paraît bloquée peut aussi attendre une saisie : observez d’abord le terminal. Pour interrompre l’exercice si nécessaire, utilisez Ctrl+C, puis vérifiez les chemins qui modifient la condition. Les règles officielles de while, break et continue décrivent le retour au test et la sortie.
Additionner des montants jusqu’à la commande q
Python 3 et sa bibliothèque standard suffisent. Enregistrez le programme complet ci-dessous dans while_input.py, en UTF-8, dans un dossier d’exercice. Dans un terminal ouvert dans ce dossier avec l’environnement virtuel du projet activé, lancez python while_input.py. Sur macOS ou Ubuntu hors environnement virtuel, utilisez python3 while_input.py si votre interpréteur porte ce nom.
total = 0
while True:
text = input("amount or q: ").strip()
if text == "q":
break
if text == "":
continue
amount = int(text)
if amount < 0:
print("skip negative")
continue
total += amount
print("total:", total)
À chaque invite amount or q:, saisissez successivement 3500, une ligne vide, -1 puis q, en appuyant sur Entrée après chaque saisie. L’invite signifie « montant ou q » ; skip negative indique qu’un montant négatif est ignoré. Le bloc suivant montre seulement la sortie du programme, sans les caractères tapés :
amount or q: amount or q: amount or q: skip negative
amount or q: total: 3500
Le total final est 3500. Dans un terminal interactif, les caractères saisis et les retours à la ligne de votre clavier apparaissent aussi ; l’affichage sera donc plus espacé que ce bloc. input() écrit son invite sans ajouter de saut de ligne, comme le précise la documentation de input().
Suivre chaque saisie sans confondre vide et zéro
.strip() retire les espaces en début et fin de saisie. La commande q est examinée avant la conversion numérique ; elle déclenche break, puis le programme affiche le total après la boucle. Une ligne vide déclenche le premier continue : Python recommence au début et appelle à nouveau input().
Une autre chaîne est convertie avec int(text). Un entier négatif affiche le message puis passe au tour suivant sans atteindre total += amount. Un entier positif est ajouté ; le texte "0" devient l’entier zéro et atteint lui aussi l’addition, sans changer le total. Il ne faut pas remplacer le test du texte vide par une règle qui rejetterait indistinctement toutes les valeurs numériques nulles.
Cette version suppose une saisie entière ou q : abc, 3.5 et Q provoquent une ValueError. Une fin de flux sans q peut provoquer une EOFError ; elle ne correspond pas à une ligne vide. Le programme ne gère pas encore ces exceptions et n’affiche pas son total final si une telle erreur interrompt la boucle.
Pour concevoir une variante avec nouvelle tentative, gardez les tests de q et du texte vide avant la conversion, puis limitez le futur bloc try à amount = int(text). Le gestionnaire except ValueError pourra expliquer la règle et continuer ; le test du montant négatif et l’addition resteront après ce gestionnaire, à l’intérieur de la boucle. Évitez de masquer toutes les erreurs avec une capture trop large. La version présentée ici conserve volontairement son comportement initial pour rendre l’erreur observable.
Tester les sorties et comprendre leur portée
- Relancez le programme et saisissez q immédiatement : le total doit être zéro. Essayez ensuite 0 puis q : le résultat est encore zéro, mais la saisie 0 a été traitée comme un montant.
- Relancez avec 10, 20 puis q : le total doit être 30. Avec 10, -1, 20 puis q, le message d’exclusion apparaît et le total reste 30.
- Relancez avec abc pour observer la
ValueError. Recommencez ensuite avec Q : la majuscule n’est pas reconnue comme commande. Si votre règle doit accepter les deux casses, modifiez seulement le test enif text.lower() == "q":, puis vérifiez Q et q. Restaurez enfin le test initial. - Rejouez 3500, ligne vide, -1 et q afin de retrouver le total de référence et le message d’exclusion.
Dans des boucles imbriquées, break termine seulement la boucle intérieure qui le contient ; la boucle extérieure peut continuer. continue reprend également sa propre boucle. Pour quitter plusieurs niveaux, concevez explicitement la propagation d’un état ou un return depuis une fonction ; return n’est utilisable que dans une fonction.
Gardez l’accumulateur total = 0 avant la boucle afin qu’il existe même si la première commande est q. Les distinctions entre branche, indentation et affectation sur chaque chemin sont détaillées dans la leçon sur if, elif et else.




