Utiliser le for en Python : parcourir, répéter et compter
Par Darko Stankovski, 23/07/2026 (Mise à jour 23/07/2026) — Débutant
Les boucles sont une notion de base de la programmation, présentes dans tous les langages. Néanmoins, quand on va vers Python en venant de langages plus classiques comme le C (ou Java ou php…), on a tendance à écrire la structure for comme on en a l'habitude.
Mais les langages diffèrent par de la syntaxe mais aussi par des idiomes. Python a ses propres idiomes qui ne sont pas que de la cosmétique. La manière d'utiliser la boucle for, ce sur quoi elle itère, les paramètres… Tout a un sens.
Python est un langage qui s'est adapté aux usages des développeurs. La structure du for est un bel exemple.
L'usage historique de la structure for comporte 3 étapes : l'initialisation d'une valeur, la condition (on n'a pas dépassé un maximum) et l'incrément. La valeur va être utilisée comme indice pour aller chercher les éléments dans une liste (enfin, un tableau en C). Par exemple :
char *names[6] = {"Arthur", "Merlin", "Lancelot", "Robin", "Perceval", "Karadoc"};
for (int i = 0; i < 6; i++) {
display_uppercase_of(names[i]);
}
En Python, l'idée est d'utiliser le for en allant directement chercher l'élément. Il s'agit d'un itérateur qui existe dans d'autres langages sous le nom de foreach. En Python, le for est un foreach et doit être utilisé comme tel. Cette utilisation peut se formuler en "pour chaque élément de la séquence, faire…".
En Python, l'exemple précédent où, pour chaque chaîne de caractère, on doit l'afficher en capitales, nous avons :
names = ['Arthur', 'Merlin', 'Lancelot', 'Robin', 'Perceval', 'Karadoc']
for name in names:
print(name.upper())
Le for pour les boucles où l'on connait le nombre de répétitions
En Python, nous avons quelques principes et en particulier, il ne devrait y avoir qu'une et de préférence une seule manière évidente de faire cette chose.
There should be one-- and preferably only one --obvious way to do it.
On choisit le for (par rapport au while) quand on sait d'avance combien il va y avoir de répétitions. Quand on sait qu'on va répéter une action n fois, on utilise le for. C'est le cas d'usage de parcours d'une séquence.
Et le for est pratique pour répéter une action n fois. Mais n est un entier, pas une séquence.
Répéter une action n fois
Quand on répète n fois, on compte : première itération, seconde, troisième… C'est comme suivre une séquence de n entiers. Pour cela, Python fournit la fonction range(n) qui génère une séquence d'entiers. Pour répéter une action 3 fois, on aura donc :
for i in range(3):
print('Hip')
print('Hourra !')
La structure est créée pour qu'il n'y ait pas d'ambiguïté : vous voulez répéter une action n fois, alors, vous écrivez for i in range(n) et lorsque vous lisez un code contenant for i in range(n), vous savez que l'action est répétée n fois.
Mais il y a un détail que n'aime pas le débutant : si vous affichez la valeur de i de l'exemple précédent, i prend les valeurs de 0 à 2. Comparées au comptage naturel, il y a un décalage de 1. Et c'est normal…
En produisant ses valeurs, range() commence à 0, donc pour avoir n répétitions, la valeur supérieure générée est forcément n - 1 et entre les deux, tout est décalé de 1 par rapport à notre comptage naturel. Est-ce un problème ? Quand vous avez juste besoin de répéter l'action en ignorant dans quelle répétition vous êtes, non. Vous avez surtout besoin de la lisibilité de l'expression : for i in range(n) se traduit immédiatement en "répète n fois l'action".
En passant, dans ces cas, vous n'avez pas besoin de la variable d'itération et l'usage est de nommer cette variable _. C'est une convention qui existe dans plusieurs langages signifiant "la structure m'oblige à déclarer une variable dont je n'ai pas besoin". L'idée est bien d'informer le lecteur que vous n'utilisez pas cette valeur.
Le code précédent s'écrit donc :
for _ in range(3):
print('Hip')
print('Hourra !')
Mais surtout, il n'y a aucune différence avec le C !
En C, ce même code s'écrit :
#include <stdio.h>
int main(void) {
for (int i = 0; i < 3; i++) {
printf("Hip\n");
}
printf("Hourra !\n");
return 0;
}
En C, nous avons aussi la borne supérieure que nous excluons par une comparaison strictement inférieure.
Compter tout en utilisant range()
Si on a besoin de compter, on a besoin de commencer à 1 et non plus 0. On pourrait tout à fait écrire quelque chose comme :
for i in range(3):
count = i + 1
print(f'Et {count}')
print('- Ze-ro !!!')
Mais on se retrouve avec deux compteurs. Dans des cas comme celui-là, il est évidemment plus simple et moins coûteux (le prix d'une variable et une addition inutiles) d'écrire :
max_count = 3
for count in range(1, max_count + 1):
print(f'Et {count}')
print('- Ze-ro !!!')
On peut argumenter que ceci entraîne une difficulté de lecture en particulier de la borne supérieure. Mais si nous traduisons ce code en C, nous avons :
#include <stdio.h>
int main(void) {
int max_count = 3;
for (int count = 1; count <= max_count; count++) {
printf("Et %d\n", count);
}
printf("- Ze-ro !!!\n");
return 0;
}
À priori, entre le for count in range(4) de Python et le for (int count = 1; count <= 3; count++) du C, il est plus facile d'identifier la valeur de la borne supérieure en C. Ce qui n'est pas vrai car en C, vous devez faire attention à une comparaison strictement inférieur (<) ou inférieur ou égale (<=). Là où en Python il n'y a plus de confusion (la borne supérieure est exclue), en C et dans les langages similaires, vous devez faire attention au type de comparaison.
En passant, c'est dans ce but que si vous avez besoin de compter, la signature complète est range(start, stop, step) et vous pouvez indiquer borne de début, fin et le pas pour lequel vous pouvez aussi utiliser les valeurs négatives :
for count in range(10, 0, -1):
print(f'{count}…') # Affichera un décompte de 10 à 1
print('Go !!!')
Avec cet exemple, vous voyez qu'un intérêt de l'exclusion de la borne supérieure est de faire une action spécifique une fois atteinte.
Parcourir une séquence en comptant les éléments
Revenons quelques instants au parcours de séquence tel que nous l'avons vu au début. Nous n'avons pas besoin de compteur pour parcourir une séquence contrairement au C. Mais vous avez des cas où vous devez connaitre la position des éléments, donc de les compter.
Python propose alors une syntaxe dédiée avec un objet spécifique : enumerate() et l'usage est le suivant :
names = ['Arthur', 'Merlin', 'Lancelot', 'Robin', 'Perceval', 'Karadoc']
for index, name in enumerate(names):
print(f'{index} - {name.upper()}')
À chaque itération, enumerate() fournit au for un tuple (index, element) où index est l'indice de l'élément dans la séquence. Dans ce cas, c'est bien l'indice réel de l'élément qui nous intéressera car il nous permettra, entre autres, d'aller chercher un autre élément par son indice ou de se positionner par rapport à ces autres éléments.
Pourquoi vous devez utiliser enumerate() et non la syntaxe C ?
Je vois souvent des débutants qui ne connaissent pas enumerate() utiliser la syntaxe C :
names = ['Arthur', 'Merlin', 'Lancelot', 'Robin', 'Perceval', 'Karadoc']
for index in range(len(names)): # NON !!!
print(f'{index} - {names[index].upper()}')
Vous ne devez pas utiliser cette syntaxe !!!
Elle marche et Python utilisant l'indexation directe, elle n'est pas plus lente que l'itération (la complexité reste en O(n)). Cependant, elle a 3 défauts :
- Elle n'est pas idiomatique (Pythonique)
- En conséquence, elle est plus lourde et moins lisible :
for name in namespermet de comprendre en lisant l'en-tête que nous allons parcourir une séquence là oùfor index in range()indique que nous allons compter des répétitions. - Elle ne fonctionne pas avec toutes les séquences ou plus généralement, avec tous les itérables. Un itérable est un objet qui fournit les éléments les uns après les autres et n'a pas forcément d'indices pour les éléments. C'est le cas de générateurs comme le
range()mais aussi de fichiers, de dictionnaires, d'ensembles (set). Python étant un langage dynamique, la donnée sur laquelle itérer pourra ne pas toujours être une donnée avec des indices et ce jour là, le programme plante.
Utiliser enumerate() n'est donc pas qu'une préférence syntaxique. C'est réellement une robustesse du code pour ce qu'est Python : un langage dynamique.
Petit bonus : si avec enumerate(), vous avez par exemple besoin d'utiliser la position de l'élément (en commençant par exemple à 1) et non l'indice, sachez qu'il y a un paramètre optionnel start=0. Pour afficher un classement, ce sera :
names = ['Arthur', 'Merlin', 'Lancelot', 'Robin', 'Perceval', 'Karadoc']
for index, name in enumerate(names, start=1):
print(f'{index} - {name.upper()}') # Affichera les positions en partant de 1
Et bien entendu, vous pouvez commencer à la valeur que vous souhaitez. Ceci peut être utile avec, par exemple, le slicing où vous allez parcourir un extrait de la liste mais vous avez besoin de l'indice réel :
names = ['Arthur', 'Merlin', 'Lancelot', 'Robin', 'Perceval', 'Karadoc']
start_index = 2
for index, name in enumerate(names[start_index:], start=start_index):
print(f'{index} - {name.upper()}')
Pour résumer
En Python, ce que vous écrivez a un sens. La manière dont vous écrivez la structure for indique vos intentions :
- Parcourir une séquence
seq, qui est la raison d'être dufor:for element in seq. - Répéter une action
nfois :for _ in range(n). - Compter de
1àn(inclus) :for count in range(1, n + 1). - Parcourir une séquence en comptant la position de l'élément :
for index, element in enumerate(seq).
Évitez de tordre le langage. Utilisez ses idiomes, ils ont un sens et permettent de faciliter la compréhension du code.
One more thing : au fait, range() n'est plus une fonction
On parle souvent de la fonction range mais ce n'est plus une fonction.
range() était bien une fonction en Python 2. Elle retournait une liste d'entiers. En Python 3, la fonction a été supprimée et remplacée par une classe. L'appel range(n) retourne un objet. Similaire à un générateur, il est plutôt une séquence paresseuse (il ne matérialise pas la liste en mémoire). Conserver une casse en minuscule permet d'être rétro-compatible avec le code Python 2 et tous usages des listes.