Séance 04 · Partie A · Python pas à pas
Boucles.
Un robot lit ses capteurs cent fois par seconde, pendant des heures. Personne n’écrit cent lignes identiques : on écrit une boucle.
Durée : 60 à 90 min · Objectifs : for et range(), while, accumulateurs, break / continue, boucles imbriquées, et savoir choisir entre les deux.
Ce que vous saurez faire à la fin
- Répéter un bloc un nombre connu de fois, ou jusqu’à ce qu’une condition change.
- Calculer une somme, un maximum, compter des occurrences.
- Dérouler une boucle « à la main » pour prédire son résultat.
- Écrire la boucle principale d’un robot simulé.
01 / for
Répéter un nombre connu de fois
range(5)produit 0, 1, 2, 3, 4 : cinq valeurs, en partant de 0, sans le 5.- À chaque tour,
iprend la valeur suivante et le bloc indenté s’exécute. - Après le dernier tour, le programme continue après la boucle.
Pourquoi 0 à 4 et pas 1 à 5 ? Même raison que les positions dans une chaîne : on compte les décalages.
Les trois formes de range
range(n) : de 0 à n−1. range(a, b) : de a à b−1. range(a, b, pas) : de a vers b par sauts de pas, sans atteindre b. Un pas négatif compte à rebours : range(10, 0, -1) donne 10, 9, …, 1. Testez chacune dans l’éditeur ci-dessus.
01 / for
Le for parcourt n’importe quelle séquence
Vocabulaire
On dit que le for itère sur une séquence (chaîne, liste, range…). La variable de boucle prend successivement chaque élément. Vous verrez à la séance 06 que beaucoup d’objets sont parcourables ainsi, et à la séance 17 comment créer les vôtres.
02 / Accumuler
Le motif le plus important de la programmation
Un accumulateur est une variable créée avant la boucle et modifiée à chaque tour.
- Initialiser (0 pour une somme, 1 pour un produit).
- Mettre à jour dans la boucle.
- Exploiter le résultat après.
Erreur classique : mettre total = 0 dans la boucle. Essayez, observez.
Dérouler à la main
Avant d’exécuter, faites un tableau : une colonne n, une colonne total. Ligne par ligne : n=1 total=1, n=2 total=3, n=3 total=6… C’est fastidieux et c’est exactement ce qu’il faut faire quand un programme ne donne pas ce qu’on attend. Les correcteurs de concours vous demanderont de « dérouler » un algorithme : entraînez-vous dès maintenant.
02 / Accumuler
Variantes : compter, chercher le maximum
Pourquoi pas maximum = 0 ?
Si toutes les mesures étaient négatives (température en hiver !), maximum = 0 resterait à 0 et serait faux. Partir du premier élément est la seule initialisation toujours correcte. Réfléchir aux valeurs limites (liste vide, négatifs, un seul élément) est un réflexe indispensable.
03 / while
Répéter tant qu’une condition est vraie
whileteste la condition avant chaque tour.- Tant qu’elle est vraie, le bloc s’exécute. Dès qu’elle est fausse, on sort.
- On ne sait pas d’avance combien de tours : c’est le cas typique du
while.
Piège mortel : la boucle infinie
Si la condition ne devient jamais fausse, le programme ne s’arrête plus. Enlevez la ligne altitude -= vitesse : la page se bloquera (rechargez-la). Dans un vrai terminal, Ctrl+C interrompt. Règle : dans un while, quelque chose dans le bloc doit faire progresser la condition vers False. Vérifiez-le à chaque fois que vous en écrivez un.
03 / while
for ou while ?
| Situation | Choix | Exemple |
|---|---|---|
| Nombre de répétitions connu | for | 10 mesures, chaque élément d’une liste |
| Répéter jusqu’à un événement | while | Tant que l’obstacle n’est pas détecté |
| Boucle principale d’un robot | while True | Lire, décider, agir, recommencer |
| Redemander une saisie invalide | while | Tant que la réponse n’est pas un nombre |
Tout for peut s’écrire en while. L’inverse n’est pas vrai. Le for est plus sûr : il s’arrête toujours.
03 / while
Sortir ou sauter : break et continue
while True:+break: la boucle infinie contrôlée. C’est la forme habituelle d’une boucle de robot.continueignore la fin du bloc pour ce tour.print(n, end=" "): affiche sans retour à la ligne.
Utiliser avec modération
Un break bien placé rend le code plus clair (« on a trouvé, on arrête »). Trop de break et continue dispersés rendent une boucle imprévisible. Si vous en avez plus de deux dans une boucle, il y a sans doute une façon plus simple de l’écrire.
04 / Imbriquer
Une boucle dans une boucle
Pour chaque tour de la boucle externe, la boucle interne fait tous ses tours.
5 × 5 = 25 affichages. 3 × 3 = 9 mesures.
Le nombre total d’opérations est le produit des tailles. Avec 1000 × 1000, c’est un million : les boucles imbriquées coûtent vite cher. On mesurera ça précisément en séance 11.
04 / Imbriquer
Saisie robuste : while + conversion
Décryptage
.isdigit() est vrai si la chaîne ne contient que des chiffres. On teste d’abord cela, et seulement ensuite on convertit : grâce à or, si not reponse.isdigit() est vrai, Python n’évalue pas la deuxième partie (évaluation « paresseuse ») et int("abc") n’est jamais tenté. Ce détail est une vraie protection, pas une coïncidence. Testez en tapant « abc », « 250 », puis « 42 ».
05 / Défis
Défi ★ — La table et le compte à rebours
Consigne
1. Afficher la table de multiplication de 7, de 7 × 1 à 7 × 10, une ligne par produit, sous la forme « 7 x 3 = 21 ».
2. Afficher un compte à rebours de 10 à 1 puis « Décollage ! », avec un seul for.
Correction
for i in range(1, 11):
print(f"7 x {i} = {7 * i}")
for n in range(10, 0, -1):
print(n)
print("Décollage !")05 / Défis
Défi ★★ — Les chiffres d’un nombre, pour de bon
Consigne
À la séance 02 vous avez additionné les chiffres d’un nombre à trois chiffres. Faites-le maintenant pour un entier quelconque avec une boucle while, sans convertir en texte. Puis affichez aussi le nombre de chiffres.
Correction
n = int(input("Un entier positif ? "))
somme = 0
nb_chiffres = 0
while n > 0:
somme += n % 10 # le chiffre des unités
n = n // 10 # on retire ce chiffre
nb_chiffres += 1
print(f"Somme des chiffres : {somme}, nombre de chiffres : {nb_chiffres}")Déroulez pour n = 472 : (472, 0) → (47, 2) → (4, 9) → (0, 13). La condition n > 0 progresse bien vers faux car n // 10 finit toujours par atteindre 0. Cas limite : n = 0 donne 0 chiffre… est-ce ce qu’on veut ? Corrigez si nécessaire.
05 / Défis
Défi ★★★ — Esprit prépa : la conjecture de Syracuse
Consigne
Partant d’un entier n : s’il est pair, on le divise par 2 ; s’il est impair, on calcule 3n + 1. On recommence. La conjecture de Syracuse (non démontrée à ce jour !) affirme qu’on atteint toujours 1.
1. Afficher la suite à partir de 27 et compter le nombre d’étapes (« temps de vol »).
2. Parmi les entiers de 1 à 1000, lequel a le plus long temps de vol ?
Correction et ouverture
def temps_de_vol(n):
etapes = 0
while n != 1:
if n % 2 == 0:
n = n // 2
else:
n = 3 * n + 1
etapes += 1
return etapes
print("27 :", temps_de_vol(27), "étapes")
record, champion = 0, 1
for n in range(1, 1001):
t = temps_de_vol(n)
if t > record:
record, champion = t, n
print(f"Champion : {champion} avec {record} étapes")27 met 111 étapes et grimpe jusqu’à 9232. Le champion sous 1000 est 871 (178 étapes). On a utilisé une fonction (séance 05) pour ne pas écrire la boucle deux fois : c’est un avant-goût. Ce problème est célèbre parce qu’il est trivial à programmer et que personne n’a réussi à prouver que la boucle while se termine toujours. Le mathématicien Paul Erdős a dit : « les mathématiques ne sont pas encore prêtes pour de tels problèmes ».
06 / Mini-projet
La boucle principale d’un robot simulé
À vous
Exécutez plusieurs fois. Puis : (1) baissez la batterie de départ à 20 et observez ; (2) ajoutez un compteur d’obstacles rencontrés ; (3) faites en sorte que le robot recule de 5 cm quand il rencontre un obstacle deux fois de suite. Cette structure « tant que la mission n’est pas finie : percevoir, décider, agir » est celle de tout robot réel. Sur Arduino, elle s’appelle loop() et tourne toute seule.
07 / Vérification
Combien de tours fait for i in range(2, 10, 3) ?
Deux questions supplémentaires
1. Que fait while 1 < 2: ? Une boucle infinie, puisque la condition est toujours vraie. Il faut un break à l’intérieur.
2. Combien de fois print s’exécute-t-il dans for i in range(4): for j in range(i): print(i, j) ? 0 + 1 + 2 + 3 = 6 fois. La boucle interne dépend de la boucle externe.
Référence
Les mots à retenir
| Mot | Définition |
|---|---|
| Boucle | Structure qui répète un bloc. |
| Itération | Un tour de boucle. |
range(a, b, pas) | Suite d’entiers de a à b exclu. |
| Accumulateur | Variable mise à jour à chaque tour (somme, compteur, max). |
| Boucle infinie | Boucle dont la condition ne devient jamais fausse. |
break / continue | Quitter la boucle / passer au tour suivant. |
Pour continuer
Vous savez répéter
Vos programmes grossissent. Il est temps d’apprendre à les découper en morceaux réutilisables : les fonctions.
À faire chez soi
- Refaire les défis sans la correction. Dérouler à la main le défi ★★ pour n = 905.
- Afficher un triangle d’étoiles de 5 lignes (1 étoile, puis 2, puis 3…).
- Simuler 1000 lancers de dé avec
random.randint(1, 6)et compter combien de fois sort le 6. Est-ce proche de 1000/6 ?