La boucle for en Python : parcourir une séquence

La boucle for parcourt les éléments d'une séquence un par un : ni compteur à gérer, ni condition d'arrêt à écrire, ni longueur à connaître à l'avance.
5 min de lecture
Believemy logo

Définition

Programmer, c'est très souvent refaire le même geste sur chaque élément d'une collection : afficher chaque nom d'une liste, nettoyer chaque ligne d'un fichier. Recopier la même instruction autant de fois qu'il y a d'éléments supposerait de connaître ce nombre à l'avance, ce qui arrive rarement.

La boucle for règle ce problème : elle parcourt les éléments d'une séquence un par un et exécute le même bloc pour chacun d'eux, quel que soit leur nombre. Là où d'autres langages réclament un compteur, une condition d'arrêt et une incrémentation, Python ne demande que la chose à parcourir. C'est la boucle la plus utilisée du langage.

PYTHON
for prenom in ["Camille", "Sacha", "Noa"]:
    print("Bonjour", prenom)    # exécuté une fois par prénom

La variable prenom prend successivement chaque valeur de la liste. Elle n'a pas besoin d'exister avant : la boucle la crée d'elle-même, et son nom est libre, à choisir parlant.

Reste à savoir où s'arrête le bloc répété. Le décalage vers la droite le dit : ce qui suit les deux-points et reste indenté appartient à la boucle. L'indentation fait donc partie du sens du programme.


Ce que for sait parcourir

La question qui suit est presque toujours la même : est-ce réservé aux listes ? Non, for accepte tout ce qui se parcourt élément par élément, ce que Python appelle un itérable. Ce que la variable reçoit dépend de l'objet parcouru, comme le montre ce tableau.

Objet parcouruCe que reçoit la variable
Une liste ou un tupleChaque élément, dans l'ordre
Une chaîne de caractèresChaque caractère, un par un
Un dictionnaireChaque clé, pas la valeur
Un setChaque élément, dans un ordre non garanti
Un fichier ouvertChaque ligne, retour à la ligne compris

La ligne du dictionnaire prend beaucoup de monde à contre-pied : le parcours ne donne que les clés. Les valeurs se demandent avec .values(), les deux ensemble avec .items().

L'oubli se paie comptant : une boucle écrite en croyant recevoir des valeurs travaille en fait sur des clés, sans que rien ne l'annonce avant qu'une opération impossible ne la trahisse. D'où bien des KeyError au début.

Attention

Les lignes lues dans un fichier gardent leur retour à la ligne collé à la fin. Comparer une ligne à un mot attendu échoue donc toujours, sans message d'erreur. Passez-la par .strip() avant de comparer, sinon la faute restera introuvable.


Le piège du compteur

Quand on arrive d'un autre langage, le réflexe est de compter jusqu'à la longueur de la liste, puis de lire chaque élément par son indice. Le code marche, mais il refait à la main le travail de for.

PYTHON
couleurs = ["rouge", "vert", "bleu"]

# Ce qui marche, mais que personne n'écrit en Python
for i in range(len(couleurs)):
    print(couleurs[i])          # i ne sert qu'à retrouver l'élément

# Ce qu'on écrit : la boucle donne directement l'élément
for couleur in couleurs:
    print(couleur)

# Et quand le rang compte vraiment, enumerate donne les deux
for rang, couleur in enumerate(couleurs, start=1):
    print(rang, couleur)        # 1 rouge, 2 vert, 3 bleu

Les deux premières boucles affichent la même chose. Ce qui les sépare, c'est qu'une seule manipule des numéros : un compteur, une longueur, puis un accès par indice. Trois occasions de se tromper là où la seconde n'en offre aucune.

Reste le cas où le rang compte vraiment, pour numéroter un affichage par exemple. C'est le rôle d'enumerate, qui renvoie à chaque tour la position et l'élément, avec un start pour compter à partir de 1. Le numéro est là sans jamais indexer la liste, donc sans risquer l'IndexError.

Bon à savoir

Quand une boucle ne sert qu'à construire une nouvelle liste à partir d'une autre, Python propose une écriture plus dense, la compréhension de liste. Elle n'accepte ni sortie anticipée ni bloc de plusieurs lignes.


Sortir ou passer son tour

Une boucle ne va pas toujours jusqu'au bout. break la quitte sur-le-champ, sans examiner les éléments restants : ce qu'on veut dans une recherche, où continuer après avoir trouvé fait perdre du temps.

continue agit plus doucement : il abandonne le tour en cours et passe au suivant. Les cas à ignorer s'écartent dès le début du bloc, au lieu d'envelopper tout le reste dans une condition.

Une troisième forme surprend : else peut se rattacher à une boucle, pas seulement à un if. Son bloc ne s'exécute que si la boucle est allée au bout sans rencontrer de break : l'endroit idéal pour signaler qu'une recherche n'a rien donné.


Questions fréquentes

Question

Quelle est la différence entre for et while en Python ?

La boucle for parcourt une collection dont le contenu existe déjà : le nombre de tours est fixé au démarrage. while répète tant qu'une condition reste vraie, sans savoir combien de tours cela prendra, ce qui convient à une saisie utilisateur. Dès qu'une collection est en jeu, for s'impose.

Question

Peut-on modifier une liste pendant qu'on la parcourt ?

C'est possible, et c'est une très mauvaise idée. Supprimer un élément décale d'un cran tous ceux qui suivent, alors que la boucle avance d'une position à chaque tour : un élément sur deux passe à la trappe, sans avertissement. Construisez plutôt une nouvelle liste.

Question

La variable de boucle existe-t-elle encore après le for ?

Oui : elle survit à la boucle et garde la dernière valeur parcourue, ce qui peut faire croire qu'un calcul a fonctionné alors que la boucle n'a tourné qu'une fois. Sur une séquence vide, à l'inverse, elle n'est jamais créée et sa lecture déclenche une NameError. La boucle fait passer d'une suite d'instructions à un programme qui traite des données : notre formation Python l'aborde sur des fichiers réels dès les premières sessions.

Termes connexes

Découvrez notre glossaire Python

Parcourez les termes et définitions les plus couramment utilisés dans le domaine du développement avec Python.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.