PYTHON → ROBOTIQUE · 04

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, i prend 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.

  1. Initialiser (0 pour une somme, 1 pour un produit).
  2. Mettre à jour dans la boucle.
  3. 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

  • while teste 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 ?

SituationChoixExemple
Nombre de répétitions connufor10 mesures, chaque élément d’une liste
Répéter jusqu’à un événementwhileTant que l’obstacle n’est pas détecté
Boucle principale d’un robotwhile TrueLire, décider, agir, recommencer
Redemander une saisie invalidewhileTant 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.
  • continue ignore 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

MotDéfinition
BoucleStructure qui répète un bloc.
ItérationUn tour de boucle.
range(a, b, pas)Suite d’entiers de a à b exclu.
AccumulateurVariable mise à jour à chaque tour (somme, compteur, max).
Boucle infinieBoucle dont la condition ne devient jamais fausse.
break / continueQuitter 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

Documentation

Tutoriel officiel : for · range

← Séance 03SommaireSéance 05 : Fonctions →