1.3 · Boucles (for, while) & compréhensions

Niveau 1 · Bases du langage

1.3Boucles (for, while) & compréhensions

Objectif : itérer efficacement avec for et while, contrôler le flux avec break/continue, et découvrir les list comprehensions.
Temps estimé : 14 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

L'essentiel en 30 secondes

  • for parcourt des choses : for nom in eleves: — pas d'indices à la C ; enumerate() si l'indice compte, range() pour compter.
  • while = tant que, avec sortie : la condition doit évoluer (compteur, break) — sinon boucle infinie, interrompue par Ctrl+C.
  • Compréhension = boucle simple en une ligne : [x*x for x in nombres if x > 0] — réservée aux cas simples, boucle classique au-delà.

Mini-cas filé — Nabil balaie ses répondants à Alger

Nabil doit saluer chaque répondant, relancer la saisie d'un code jusqu'à ce qu'il soit valide, puis extraire les carrés des scores positifs. Il écrit d'abord for i in range(len(noms)) avec une erreur d'indice, puis un while True sans break qui tourne sans fin. Il corrige : for nom in noms direct, while avec compteur qui décrémente, et une compréhension simple pour les carrés. Le rapport sort en une passe, sans boucle infinie.

Suite du cas 1.1-1.2 — Nabil passe des décisions à la répétition.

1. for : parcourir, pas compter

En Python on itère sur des choses (for nom in eleves:), pas sur des indices : le for sur indices à la C est le signe qu'on se bat contre le langage. Besoin d'indices ? enumerate() ; besoin de compter ? range() (range(5) donne 0 à 4). break sort de la boucle, continue saute un tour.

Nabil remplace son for i in range(len(noms)) par for nom in noms: et garde enumerate() pour numéroter le rapport : fini l'erreur d'indice.

2. while et compréhensions

Le while répète tant que la condition est vraie (saisie utilisateur, attente) : garantissez la sortie (compteur qui évolue, break). La list comprehension [expression for x in sequence if condition] filtre et transforme lisiblement en une ligne — réservée aux cas simples (une condition, une expression), sinon la boucle classique gagne.

Nabil écrit while tentatives > 0: avec décrément, puis [s**2 for s in scores if s > 0] pour les carrés positifs : la relance se termine, l'extraction tient en une ligne.

Erreur d'interprétation fréquente : « for i in range(len(x)) partout » ou « while True sans sortie, ça ira ». Non. Itérer par indice quand on veut les éléments complique et casse (enumerate() si l'indice compte vraiment). Et un while dont la condition n'évolue jamais est une boucle infinie qui bloque le programme : compteur, break ou condition qui change — toujours une sortie garantie.
Répéter juste Parcourir, tant-que, compacter for (parcourir) Sur deschoses, enumerate si indicewhile (tant que) Condition quiévolue, sortie garantieCompréhension (simple) Uneligne, une condition max
Parcourir, tant-que, compacter
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Parcourir : Nabil écrit for nom in noms — les choses directement, enumerate() pour numéroter, range() pour compter. 2) Répéter : while avec compteur qui décrémente et break de secours — la condition évolue à chaque tour. 3) Compacter : une compréhension simple pour filtrer et transformer en une ligne, boucle classique dès que ça se complique. Leçon : sur des choses au for, une sortie au while, du simple en compréhension.

Le while sans sortie (ne faites jamais ça)

« Mon programme tourne depuis 20 minutes, c'est qu'il réfléchit beaucoup, non ? »
Verdict : non — c'est un while True sans break qui boucle sur rien. Ctrl+C, puis compteur.
« J'ai mis trois compréhensions imbriquées, c'est du code senior. »
Verdict : c'est un puzzle, pas du code — une boucle classique serait relue en 10 secondes.

Moralité : une boucle sans sortie, c'est un hamster dans sa roue — très occupé, jamais arrivé.

🔎 Exemple concret — 🔎 Exemple concret — Trois façons, un seul bon choix chacune

Chaque boucle son territoire, comme Nabil sur son rapport.

for nom in ["Yasmine", "Nabil"]:
    print(f"Bonjour {nom}")
tentatives = 3
while tentatives > 0:
    tentatives -= 1
carres = [x * x for x in range(10)]
print(carres)  # [0, 1, 4, ..., 81]

Lecture : for direct sur les éléments, while avec compteur qui évolue, compréhension pour construire la liste.

Leçon : enumerate() quand l'indice compte vraiment — jamais range(len()) par réflexe.

Vocabulaire de la section

Boucle for
Répète un bloc pour chaque élément d'une séquence : for x in sequence. On parcourt des choses, pas des indices.

Exemple simple : Les répondants salués un par un par Nabil.

Ce que ce n'est pas : un for i in range(len(x)) systématique avec x[i].

Réflexe : for direct ; enumerate() si l'indice compte.

range()
Génère une plage de nombres : range(5) donne 0,1,2,3,4. Très utilisée avec for pour compter ou répéter N fois.

Exemple simple : Les carrés de 0 à 9 calculés par Nabil.

Ce que ce n'est pas : range(len(liste)) pour récupérer les éléments.

Réflexe : range() pour compter, pas pour indexer.

Boucle while
Répète un bloc TANT QUE la condition reste vraie. Risque de boucle infinie si la condition ne change jamais — garantir la sortie.

Exemple simple : La relance du code de Nabil jusqu'à saisie valide.

Ce que ce n'est pas : un while True sans break ni condition qui évolue.

Réflexe : compteur, break ou variable qui change à chaque tour.

break / continue
break sort de la boucle immédiatement ; continue passe directement à l'itération suivante.

Exemple simple : Le break de Nabil dès que le bon code est saisi.

Ce que ce n'est pas : laisser tourner toute la liste alors que la cible est trouvée.

Réflexe : break pour arrêter, continue pour sauter.

List comprehension
Écriture compacte : [expression for x in sequence if condition] construit une liste en une ligne, de façon pythonique.

Exemple simple : Les carrés des scores positifs extraits par Nabil.

Ce que ce n'est pas : une compréhension imbriquée illisible sur trois niveaux.

Réflexe : simple = compréhension ; complexe = boucle classique.

En pratique — En pratique — Itérer avec for, while et comprehensions

  1. Affichez les nombres de 1 à 10 avec « for i in range(1, 11) », puis leur carré. Ajoutez la table de multiplication d'un nombre saisi.
  2. Écrivez une boucle while qui redemande un mot de passe jusqu'à ce qu'il soit correct (attention à faire évoluer la condition).
  3. Utilisez break pour arrêter une boucle dès qu'une condition survient, et continue pour sauter les nombres pairs.
  4. Transformez une boucle qui construit une liste de carrés en une list comprehension : carres = [n**2 for n in range(10)]. Comparez la lisibilité.
Vous répétez des actions avec for et while, contrôlez le flux avec break/continue, et écrivez vos premières list comprehensions.

Script prêt à dire — proposer le for direct (30 s)

« Je propose qu'on itère directement sur les éléments plutôt que sur les indices : for nom in noms — c'est plus lisible et on élimine l'erreur d'indice. On garde enumerate() uniquement si le numéro nous sert vraiment. »

À dire en revue de code ; montrer l'avant/après sur la boucle réelle.

Modèle copier-coller — for direct, while avec sortie, compréhension

noms = ["Yasmine", "Karim", "Lina"]
for i, nom in enumerate(noms, start=1):
    print(f"{i}. Bonjour {nom}")
tentatives = 3
while tentatives > 0:
    code = input("Code ? ")
    if code == "ALGER":
        print("Code accepte")
        break
    tentatives -= 1
carres_positifs = [s ** 2 for s in [3, -1, 4] if s > 0]
print(carres_positifs)  # [9, 16]

Rapport à Alger

Comme Nabil : for direct + enumerate(start=1) — chaque répondant salué et numéroté, zéro erreur d'indice.

Relance garantie

Un while avec compteur qui décrémente et break sur succès : la saisie finit toujours par se terminer.

Extraction en une ligne

Une compréhension simple pour les scores positifs : filtrer + transformer lisiblement, sans boucle de 5 lignes.

Saut ciblé

Un continue pour ignorer les pairs : on saute un tour au lieu d'imbriquer un if — le flux reste plat.

✓ Bonnes pratiques

  • Itérer sur les choses (for direct), enumerate() si l'indice sert.
  • Garantir la sortie de chaque while (compteur, break, condition qui évolue).
  • Réserver la compréhension aux cas simples, boucle classique sinon.

✗ Pièges fréquents

  • Écrire for i in range(len(x)) systématiquement.
  • Lancer while True sans break (boucle infinie).
  • Empiler des compréhensions imbriquées illisibles.

Points clés à retenir

  • for parcourt une séquence ; while répète tant qu'une condition est vraie.
  • range() génère des plages de nombres ; enumerate() donne indice + valeur.
  • break sort de la boucle ; continue passe à l'itération suivante.
  • Les list comprehensions construisent une liste en une ligne, de façon pythonique — pour les cas simples.

Défi 48h — appliquez demain

Convertissez une boucle for + range(len()) en for direct (modèle ci-dessus), ajoutez une sortie garantie à un while, et compactez une construction de liste en compréhension simple. Comparez avant/après en local. 20 minutes suffisent.

Checklist sortie de section
  • Je parcours en for direct — enumerate() seulement si l'indice sert.
  • Mes while ont une sortie garantie et mes break/continue sont placés.
  • J'écris des compréhensions simples et lisibles.
Auto-évaluation 1-5 : est-ce que mes boucles itèrent sur des choses plutôt que des indices ?est-ce que chaque while peut réellement se terminer ?

Questions fréquentes

Quand choisir for plutôt que while ?

Utilisez for quand vous connaissez ce que vous parcourez (une liste, une plage, un fichier). Utilisez while quand vous répétez jusqu'à une condition dont vous ignorez à l'avance le nombre d'itérations (ex. « tant que l'utilisateur ne quitte pas ») — en garantissant la sortie.

Ma boucle while tourne sans fin, pourquoi ?

C'est une boucle infinie : la condition reste toujours vraie car rien ne la fait évoluer dans le bloc. Assurez-vous qu'une variable de la condition change à chaque tour (compteur, break). Ctrl+C interrompt un programme bloqué.

Vérifiez votre compréhension

Quelle écriture privilégier pour parcourir une liste ?

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 1Questions inédites et durcies pour valider vos acquis