Les fonctions intégrées de Python enumerate() La fonction est l'un des outils les plus utiles et les plus fréquemment utilisés du langage, en particulier pour tous ceux qui écrivent des boucles nécessitant à la fois les éléments d'une séquence et leurs positions. À la base, enumerate() prend un objet itérable — tel qu’une liste, un tuple, une chaîne de caractères ou même un générateur — et renvoie un itérateur qui produit des paires contenant un indice et la valeur correspondante issue de l’objet itérable d’origine.
Pour les débutants, cette fonction change la donne, car elle évite d'avoir à gérer manuellement une variable de compteur, ce qui est souvent à l'origine de bogues dans les premiers codes Python. Au lieu d'initialiser une index variable, en l'incrémentant à l'intérieur d'une boucle, et en faisant attention aux erreurs de décalage d'un, vous pouvez laisser enumerate() se charge du comptage à votre place. Le résultat est un code plus épuré, plus lisible et plus “ pythonesque ”, qui respecte la philosophie de simplicité et de clarté du langage.
Ce guide complet destiné aux débutants vous expliquera tout ce que vous devez savoir sur enumerate(): pourquoi il existe, comment il fonctionne en coulisses, sa syntaxe et ses paramètres, des exemples concrets avec différents objets itérables, des cas d'utilisation courants, des modèles avancés, les meilleures pratiques, et même quelques astuces moins connues. À la fin de cet article, vous aurez non seulement compris enumerate() mais aussi vous sentir à l'aise pour l'utiliser dans vos propres projets.
Pourquoi utiliser Python ? enumerate()?
Lorsque l'on commence à apprendre Python, l'un des premiers cas de figure que l'on rencontre consiste à parcourir une liste tout en ayant besoin de l'index de chaque élément. Une solution typique pour un débutant ressemble à ceci :
python
fruits = ['pomme', 'banane', 'cerise', 'datte', 'baie de sureau']
index = 0
for fruit in fruits:
print(f"Élément {index} : {fruit}")
index += 1Sortie :
Article n° 0 : pomme
Article n° 1 : banane
Point 2 : cerise
Point 3 : date
Point 4 : sureau
Cette approche fonctionne, mais elle présente plusieurs inconvénients :
- C'est trop fastidieux : il faut déclarer et gérer le
indexvariable vous-même. - Cela peut facilement entraîner des erreurs : on risque d'oublier d'incrémenter
indexentraîne une boucle infinie ou un résultat erroné. - Cela encombre le corps de la boucle, ce qui rend la logique proprement dite plus difficile à lire.
- Si vous devez modifier le compteur (par exemple, pour ignorer certains indices), le code devient rapidement confus.
enumerate() a été ajouté à Python précisément pour résoudre ce problème avec élégance. Il encapsule l'itérable et fournit automatiquement un index courant, commençant par défaut à 0 (ou à n'importe quel nombre que vous spécifiez).
Syntaxe et paramètres
La syntaxe officielle de enumerate() C'est simple :
python enumerate(iterable, start=0)
- itérable (obligatoire) : Tout objet prenant en charge l'itération. Cela inclut les listes, les tuples, les chaînes de caractères, les ensembles, les dictionnaires (qui itèrent par défaut sur les clés), les objets de plage, les générateurs, et même les classes personnalisées qui implémentent le protocole d'itérateur.
- début (facultatif) : un entier qui précise à quel endroit le comptage doit commencer. La valeur par défaut est 0, mais vous pouvez la définir sur 1 pour une indexation à partir de 1, sur 10 pour un décalage personnalisé, ou même sur un nombre négatif si nécessaire.
La valeur de retour est un énumérer un objet—un itérateur qui renvoie des tuples de la forme (index, élément) à chaque itération.
Comme il s'agit d'un itérateur, enumerate() est économe en mémoire : il ne crée pas d’emblée une liste complète de tuples en mémoire. Au lieu de cela, il génère chaque paire de manière paresseuse au fur et à mesure que vous parcourez la liste. Cela le rend particulièrement adapté aux itérables très volumineux, voire infinis.
Exemple de base : le cas d'utilisation classique
Voici comment faire enumerate() simplifie l'exemple précédent :
python
fruits = ['pomme', 'banane', 'cerise', 'datte', 'baie de sureau']
for index, fruit in enumerate(fruits):
print(f"Élément {index} : {fruit}")Sortie :
Article n° 0 : pomme
Article n° 1 : banane
Point 2 : cerise
Point 3 : date
Point 4 : sureau
La principale amélioration concerne le déballage des tuples dans le pour déclaration : index, fruit reçoit directement les deux éléments de chaque tuple généré par enumerate(). Ce modèle est concis, lisible et considéré comme la méthode standard pour accéder à la fois à l'index et à la valeur en Python.
Personnalisation de l'index de départ
L'une des raisons les plus courantes d'utiliser le début Ce paramètre permet de créer des listes numérotées lisibles par l'utilisateur qui commencent à 1 au lieu de 0 :
python
liste_courses = ['pain', 'lait', 'œufs', 'beurre', 'fromage']
for position, article in enumerate(liste_courses, start=1):
print(f"{position}. {article.capitalize()}")Sortie :
1. Pain
2. Lait
3. Les œufs
4. Beurre
5. Fromage
Ce modèle est utilisé partout — des menus en ligne de commande à la génération de rapports — et semble naturel aux non-programmeurs, qui s’attendent à ce que le comptage commence à 1.
Vous pouvez commencer par n'importe quel nombre entier, même négatif :
python
for i, value in enumerate([10, 20, 30], start=-2):
print(i, value)Sortie :
-2 10
-1 20
0 30
Analyse de l'objet `enumerate` en Python
Si vous voulez voir ce que enumerate() que cela génère, vous pouvez le convertir en liste :
python colors = ['red', 'green', 'blue'] print(list(enumerate(colors))) # Résultat : [(0, 'red'), (1, 'green'), (2, 'blue')] print(list(enumerate(colors, start=100))) # Résultat : [(100, 'red'), (101, 'green'), (102, 'blue')]
Cela s'avère utile pour le débogage ou lorsque vous avez besoin de disposer d'emblée de toutes les paires index-valeur (mais n'oubliez pas que la matérialisation d'itérables volumineux peut nécessiter beaucoup de mémoire).
Comment utiliser Python enumerate() Fonctionnement interne
Comprendre son fonctionnement interne permet d'en apprécier l'élégance. La documentation Python décrit enumerate() comme équivalente à cette fonction génératrice :
python
def enumerate(iterable, start=0) :
count = start
for element in iterable :
yield (count, element)
count += 1Cette implémentation simple met en évidence plusieurs points importants :
- Il utilise
rendementpour en faire un générateur (évaluation paresseuse). - Le compteur est incrémenté de 1 à chaque fois, quel que soit le contenu de l'itérable.
- Cela fonctionne avec n'importe quel objet itérable, car cela repose uniquement sur le protocole d'itération (
__iter__ou__getitem__).
Comme la version intégrée est implémentée en C, elle est également très rapide — souvent plus rapide que l'indexation manuelle en Python pur.
Python enumerate() avec différents types d'itérables
L'un des atouts de enumerate() c'est sa polyvalence avec tous les types de données de Python.
Avec des cordes
Les chaînes de caractères sont des séquences de caractères, donc enumerate() considère chaque caractère comme un élément :
python
message = "Hello, World!"
for pos, char in enumerate(message):
if char.isupper():
print(f"Lettre majuscule '{char}' à la position {pos}")Sortie :
Lettre majuscule ‘ H ’ à la position 0
La lettre majuscule ‘ W ’ à la 7e position
La lettre majuscule ‘ L ’ à la 9e position
Cela s'avère utile pour des tâches de traitement de texte, comme la recherche de la position de caractères spécifiques ou la création de nouvelles chaînes à partir d'indices.
Avec les tuples
Les tuples fonctionnent exactement comme les listes :
python
coordonnées = (10.0, 20.0, 30.0)
for idx, coord in enumerate(coordonnées):
print(f"Coordonnée {idx} : {coord}")Avec les dictionnaires
Lorsque vous parcourez un dictionnaire, celui-ci itère par défaut sur les clés :
python
student_scores = {'Alice' : 95, 'Bob' : 87, 'Charlie' : 92}
for rang, nom in enumerate(notes_des_élèves, start=1):
note = notes_des_élèves[nom]
print(f"{rang}. {nom} : {note}")Sortie :
1. Alice : 95
2. Bob : 87
3. Charlie : 92
Si vous avez besoin à la fois des clés et des valeurs, combinez-les avec .items():
python
for i, (nom, note) in enumerate(student_scores.items(), start=1):
print(f"{i}. {nom} a obtenu {note}")Avec des ensembles
Les ensembles ne sont pas ordonnés, mais enumerate() continuera d'attribuer des indices en fonction de l'ordre d'itération (qui correspond à l'ordre d'insertion dans Python 3.7 et versions ultérieures) :
python
unique_numbers = {3, 1, 4, 1, 5} # doublons supprimés
for i, num in enumerate(unique_numbers):
print(i, num)Remarque : ne vous fiez pas à l’ordre défini si vous avez besoin d’un indexage cohérent d’une exécution à l’autre dans les anciennes versions de Python.
Avec les gammes et les générateurs
Depuis gamme est déjà basé sur des index, vous n'aurez peut-être pas besoin de enumerate(), mais cela peut s'avérer utile lorsqu'on l'associe à un autre itérable via zip() (ce point sera abordé plus loin).
Cas d'utilisation courants dans la vie réelle
1. Créer des menus numérotés faciles à utiliser
Les programmes en ligne de commande proposent souvent des options numérotées :
python
options = ['Charger un fichier', 'Enregistrer un fichier', 'Exporter les données', 'Quitter']
print("Veuillez sélectionner une option :")
for num, option in enumerate(options, start=1):
print(f" {num}. {option}")
choice = int(input("Entrez un nombre : "))
selected = options[choice - 1]2. Suivi des postes dans le secteur du traitement des données
Lors du nettoyage ou de la transformation des données :
python
raw_data = [' apple ', 'banana', '', 'cherry ']
for i, item in enumerate(raw_data) :
cleaned = item.strip()
if not cleaned :
print(f"Chaîne vide trouvée à la position d'origine {i}")3. Rechercher toutes les occurrences d'un élément
Contrairement à list.index() Alors que cette méthode ne renvoie que la première occurrence, la fonction `enumerate()` vous permet de les trouver toutes :
python text = "abracadabra" search_char = 'a' positions = [i for i, char in enumerate(text) if char == search_char] print(positions) # [0, 3, 5, 7, 10]
4. Modification des listes sur place
Vous pouvez utiliser l'index pour mettre à jour des éléments (même si l'on préfère souvent créer une nouvelle liste pour garantir l'immuabilité) :
python
prices = [10,99, 15,50, 7,25, 12,00]
for i, prix in enumerate(prix) :
prix[i] = round(prix * 1,1, 2) # applique la taxe 10%
print(prix)5. Création de nouvelles séquences à l'aide d'index
Les compréhensions de liste avec enumerate() sont puissants :
python mots = ['python', 'is', 'awesome'] mots_numérotés = [(i+1, word.upper()) for i, word in enumerate(mots)] print(mots_numérotés) # [(1, 'PYTHON'), (2, 'IS'), (3, 'AWESOME')]
Motifs et combinaisons avancés
Combiner enumerate() avec zip()
Lorsque l'on parcourt plusieurs séquences simultanément et que l'on a besoin d'indices :
python
noms = ['Alice', 'Bob', 'Charlie']
notes = [95, 87, 92]
classifications = ['A', 'B', 'A-']
for i, (nom, note, mention) in enumerate(zip(noms, notes, mentions), start=1):
print(f"{i}. {nom} : {note} ({mention})")Utilisation enumerate() dans le tri
Conserver les index d'origine lors du tri :
python
students = [('Bob', 87), ('Alice', 95), ('Charlie', 92)]
# Trier par note décroissante tout en conservant l'ordre d'origine en cas d'égalité
étudiants_triés = sorted(énumérer(étudiants), clé=lambda x: x[1][1], inverser=Vrai)
for position_originale, (nom, note) in élèves_triés :
print(f"Position d'origine {position_originale+1} : {nom} ({note}))")Énumération des séquences inversées
python
for i, item in enumerate(reversed(['first', 'second', 'third'])):
print(f"À partir de la fin : position {i}, élément {item}")Ou avec un démarrage personnalisé :
python
for countdown, item in enumerate(reversed(['go', 'set', 'ready']), start=3):
print(f"{countdown}... {item}")Conseils, bonnes pratiques et pièges courants
- Toujours préférer
enumerate()par rapport à l'indexation manuelle lorsque vous avez besoin à la fois de l'index et de la valeur. - Utilisez des noms de variables significatifs: index, élément ou
i, elemça va, maisposition, fruitouclasse, élèveaméliore la lisibilité. - N'oublie pas que c'est de la paresse: Idéal pour les grands volumes de données, mais si vous avez besoin d'un accès aléatoire, convertissez-les en liste ou optez pour une autre approche.
- N'utilisez pas
enumerate()lorsque vous n'avez besoin que des valeurs— cela entraîne une charge supplémentaire inutile. - Faites attention lorsque vous modifiez l'itérable pendant son énumération— cela peut entraîner l'omission ou la répétition d'éléments.
- Pour les itérables vides, le corps de la boucle ne s'exécute tout simplement jamais — il n'est donc pas nécessaire de procéder à des vérifications particulières dans la plupart des cas.
- Remarque concernant les performances:
enumerate()est hautement optimisé et généralement plus rapide que le comptage manuel en Python pur.
Conclusion
Le enumerate() Cette fonction peut paraître modeste et sans prétention, mais elle incarne parfaitement la philosophie de conception de Python : des solutions simples, lisibles et efficaces à des problèmes courants. En fournissant automatiquement des indices lors de l'itération, elle élimine toute une catégorie d'erreurs de débutants tout en favorisant un code épuré, très apprécié des développeurs expérimentés.
Que vous développiez un simple script, traitiez des données, créiez des interfaces utilisateur ou vous attaquiez à des algorithmes complexes, enumerate() reviendra sans cesse. Le maîtriser dès le début vous permettra d'acquérir des bases solides en Python idiomatique et vous aidera à écrire un code non seulement correct, mais aussi élégant et facile à maintenir.
Prenez le temps de vous exercer sur les exemples proposés dans ce guide. Remplacez vos compteurs manuels par enumerate(), testez différents objets itérables et différentes valeurs de départ, et associez-le à d'autres outils Python tels que zip() et les compréhensions de liste. Très vite, l'utilisation de enumerate() vous semblera tout à fait naturel — et vous vous demanderez comment vous avez pu vous passer de cette fonction jusqu’à présent.
Si vous souhaitez mettre en pratique ces bonnes pratiques dans le cadre de projets concrets, Carmatec est une entreprise de confiance Entreprise spécialisée dans le développement Python aider les entreprises à développer des applications évolutives et hautement performantes. Que vous ayez besoin de conseils d'experts, d'une optimisation du code ou que vous souhaitiez recruter des développeurs Python Grâce à son expérience pratique en matière de pratiques de codage propres et efficaces, Carmatec propose des solutions adaptées à vos objectifs commerciaux.