Les boucles
Répéter sans se répéter : for, range, while, accumulateurs, break et continue
§1.L'ordinateur ne se lasse jamais
C'est là son avantage décisif sur nous. Répéter dix mille fois la même opération sans erreur ni fatigue, c'est exactement ce qu'il sait faire. Les boucles sont l'outil qui te donne accès à cette force.
Python en propose deux, et le choix entre elles est presque toujours évident : le for quand tu SAIS combien de fois répéter, le while quand tu répètes JUSQU'À ce qu'une condition change.
for i in range(5): print("Tour numéro", i)Comme pour le if : deux-points, puis un bloc indenté. La variable i prend successivement chaque valeur produite par range(5), c'est-à-dire 0, 1, 2, 3, 4.
§4.Les trois formes de range
- range(n)
- De 0 à n − 1.
- Exemple. range(4) donne 0, 1, 2, 3.
- range(debut, fin)
- De debut à fin − 1. La borne de fin est toujours exclue.
- Exemple. range(1, 5) donne 1, 2, 3, 4.
- range(debut, fin, pas)
- Avec un pas, qui peut être négatif pour compter à l'envers.
- Exemple. range(0, 10, 2) donne 0, 2, 4, 6, 8. range(5, 0, -1) donne 5, 4, 3, 2, 1.
§6.L'accumulateur : le motif à connaître par cœur
La plupart des boucles utiles suivent le même schéma. On crée une variable AVANT la boucle, on la met à jour à chaque tour, et on l'utilise APRÈS. Cette variable s'appelle un accumulateur.
Trois usages reviennent sans cesse : additionner (accumulateur initialisé à 0), multiplier (initialisé à 1), et compter (initialisé à 0, incrémenté sous condition).
La valeur de départ n'est pas arbitraire : 0 pour une somme parce qu'ajouter 0 ne change rien ; 1 pour un produit parce que multiplier par 1 ne change rien.
# Somme des entiers de 1 à 100total = 0for i in range(1, 101): total += iprint("Somme :", total) # Factorielle de 6produit = 1for i in range(1, 7): produit *= iprint("6! =", produit) # Compter les multiples de 3 sous 50compte = 0for i in range(50): if i % 3 == 0: compte += 1print("Multiples de 3 :", compte)Toujours la même structure : initialiser, mettre à jour dans la boucle, utiliser après. Si tu retiens un seul motif de ce chapitre, que ce soit celui-là.
§9.La boucle while
Le while répète tant qu'une condition reste vraie. On l'emploie quand le nombre de tours n'est pas connu à l'avance : diviser jusqu'à atteindre 1, chercher jusqu'à trouver, redemander jusqu'à obtenir une réponse valide.
Il impose une discipline : quelque chose DANS la boucle doit finir par rendre la condition fausse. Sinon, elle tourne indéfiniment.
# Combien de fois peut-on diviser 1000 par 2 ?n = 1000etapes = 0while n > 1: n = n // 2 etapes += 1print(etapes, "divisions") # Ici, un for aurait été impossible :# on ne sait pas d'avance combien d'étapes il faudra.La variable n change à chaque tour et finit par atteindre 1 : la condition devient fausse, la boucle s'arrête. C'est cette garantie de terminaison qu'il faut vérifier mentalement à chaque while que tu écris.
La suite de Syracuse : si le nombre est pair on le divise par deux, sinon on le triple et on ajoute un. Personne n'a jamais démontré qu'elle atteint toujours 1, mais elle le fait pour tous les nombres testés à ce jour.
§13.break et continue
- break
- Sort immédiatement de la boucle, sans finir le tour en cours ni faire les suivants.
- Exemple. Dès qu'un diviseur est trouvé, inutile de continuer à chercher : break.
- continue
- Passe directement au tour suivant, en sautant le reste du bloc.
- Exemple. Ignorer les valeurs négatives d'une série sans les traiter.
n = 91diviseur = 0 for d in range(2, n): if n % d == 0: diviseur = d break # inutile de chercher plus loin if diviseur == 0: print(n, "est premier")else: print(n, "est divisible par", diviseur)Sans le break, la boucle continuerait jusqu'à 90 pour rien. Sur de grands nombres, cette différence est énorme. Chercher, c'est savoir s'arrêter quand on a trouvé.
§15.Les boucles imbriquées
Une boucle peut en contenir une autre. La boucle intérieure effectue tous ses tours pour CHAQUE tour de la boucle extérieure : trois tours dehors et quatre dedans font douze passages au total.
C'est ce qu'il faut pour parcourir une grille, produire une table à double entrée, ou comparer tous les couples d'éléments d'une série.
for i in range(1, 4): for j in range(1, 4): print(i, "x", j, "=", i * j) print("---")Le print("---") est indenté au niveau de la boucle EXTÉRIEURE : il s'exécute une fois par valeur de i, pas à chaque produit. Ici encore, l'indentation décide de tout.
À retenir
- for quand on sait combien de tours, while quand on répète jusqu'à ce qu'une condition change.
- range(n) va de 0 à n − 1 : la borne finale est toujours exclue.
- Le motif de l'accumulateur : initialiser AVANT, mettre à jour DEDANS, utiliser APRÈS. 0 pour une somme, 1 pour un produit.
- Dans un while, quelque chose doit faire évoluer la condition — sinon la boucle est infinie.
- break sort de la boucle, continue saute au tour suivant.
- Dans des boucles imbriquées, l'intérieure tourne entièrement à chaque tour de l'extérieure.
- for _ in range(n) quand le compteur ne sert pas.