
Trois pages de documentation officielle lues d'affilée, et je n'étais pas plus avancée sur la différence entre une boucle for et une boucle while qu'avant de les ouvrir. C'est le genre de piège qui guette toute débutante qui apprend à coder toute seule, à Clermont-Ferrand, sans personne à côté pour transformer une définition abstraite en exemple qui parle. Le mythe que je traînais depuis mes débuts, c'est de croire que for et while faisaient à peu près la même chose, juste avec une syntaxe différente qu'on choisirait un peu au hasard, selon l'humeur du soir.
Une boucle for et une boucle while, est-ce vraiment la même chose ?
La réponse courte : non, et la différence ne tient pas qu'à la syntaxe. Une boucle for parcourt quelque chose qui existe déjà — une liste de courses, une série de nombres — du premier élément au dernier, et elle sait dès le départ combien de tours elle va faire. Une boucle while, elle, répète une action tant qu'une condition reste vraie, sans savoir à l'avance si ça va durer deux tours ou deux cents. Confondre les deux, c'est un peu comme confondre plier une pile de linge qu'on a sous les yeux et surveiller une casserole dont on ignore quand elle va bouillir : dans les deux cas on répète un geste, mais on ne part pas avec la même information.
Ma liste de fruits m'a servi de bac à linge, justement. Python commence à compter à zéro, et le premier fruit de ma liste porte donc l'index zéro, pas un — un détail qui m'a fait douter de moi la première fois qu'un fruit inattendu s'est affiché à cette place. Ce même zéro sert aussi de point de départ à une variable qu'on incrémente ou qu'on décrémente dans une boucle while, ce qui n'aide pas vraiment à démêler les deux logiques au début. Comme je le racontais déjà dans mon entrée sur la difficulté d'apprendre la programmation Python après le travail à la maison, ce n'est presque jamais la logique seule qui bloque, c'est le temps qu'il faut pour la voir clairement.

L'indentation n'est pas une option, même si on a envie d'y croire
Le deuxième mythe, plus sournois, c'est de penser que les espaces au début d'une ligne sont une question de goût personnel. En Python, l'indentation fait partie du code : c'est elle qui indique à l'interpréteur ce qui appartient à la boucle et ce qui n'en fait pas partie, exactement comme le respecte la PEP 8, le guide de style officiel du langage. Ignorer cette règle, et le message d'erreur qui s'affiche ne fait aucun cadeau.
J'ai découvert à quel point une boucle while sans porte de sortie pouvait être redoutable le soir où j'ai oublié de faire redescendre mon compteur vers zéro. L'écran s'est mis à cracher des chiffres à une vitesse que je ne pouvais plus suivre, et le ventilateur de mon ordinateur s'est mis à souffler comme s'il voulait décoller. Ctrl+C a fini par tout arrêter, mais la leçon est restée : une condition qui ne change jamais transforme une boucle en un geste qui se répète pour toujours, sans jamais lâcher la main.
Compter jusqu'à quatre quand on annonce cinq
Le troisième mythe est plus technique, mais tout aussi répandu : croire que range(5) va afficher les chiffres de un à cinq. Ce n'est pas le cas. Python s'arrête juste avant la borne indiquée, et range(5) génère 0, 1, 2, 3 et 4 — cinq valeurs, mais pas celle qu'on attendait de voir apparaître. La première fois que j'ai écrit une boucle for sans avoir mes notes sous les yeux, et qu'elle a tourné du premier coup, cette histoire de borne exclusive s'était enfin installée quelque part dans ma tête sans que j'aie eu besoin de la réciter.
J'en ai parlé avec Gwilherm, un pair croisé dans un fil de forum consacré justement aux boucles for. Il apprend Python pour analyser les données de ses machines industrielles, et il avance toujours par petits projets concrets plutôt que par grandes théories — ça m'a donné envie de chercher, moi aussi, un vrai projet plutôt que d'enchaîner des exemples qui ne mènent nulle part.
Pour digérer tout ça, je suis allée marcher du côté de la place de Jaude avant de me remettre devant l'écran. Ça ne résout rien en soi, mais ça évite de rester bloquée à fixer le même message d'erreur jusqu'à ce que les lettres perdent leur sens.
La règle pour choisir entre for et while
Voilà la règle simple à laquelle je reviens maintenant, le stylo entre les doigts qui frappe doucement le bord de mon cahier chaque fois qu'un script résiste encore un peu : si je connais déjà ce que je dois parcourir — une liste, une plage de nombres — c'est une boucle for. Si j'attends qu'une condition change sans savoir combien de temps ça va prendre, c'est une boucle while, avec toujours une porte de sortie prévue dès la première ligne. Je n'ai pas encore essayé d'enfermer tout ça dans une fonction à moi ; ce sera sans doute la prochaine étape.
Reste à savoir ce que je ferai le jour où une boucle en contiendra une autre, imbriquée dans une troisième. Pour l'instant, j'évite soigneusement la question.