1.3Boucles (for, while) & compréhensions
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.
Le while sans sortie (ne faites jamais ça)
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
- 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.
- Écrivez une boucle while qui redemande un mot de passe jusqu'à ce qu'il soit correct (attention à faire évoluer la condition).
- Utilisez break pour arrêter une boucle dès qu'une condition survient, et continue pour sauter les nombres pairs.
- 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é.
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.
- 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.
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é.
Quelle écriture privilégier pour parcourir une liste ?