Cours de Python / Parcourir des données avec for, range, enumerate et zip
Une boucle for traite successivement les éléments d’un objet itérable. Parcourez directement les valeurs quand cela suffit, utilisez enumerate() pour ajouter un compteur et zip() pour associer des collections liées.
Parcourir des valeurs ou un intervalle numérique
Un objet itérable peut fournir ses éléments un à un : une liste, une chaîne ou un range peut servir de source à une boucle. for name in names: donne directement chaque nom ; il n’est pas nécessaire de calculer un indice pour lire chaque élément. Les instructions de la boucle sont indentées sous sa ligne terminée par un deux-points.
range(start, stop, step) représente une séquence d’entiers dont la borne stop est exclue. Le début vaut zéro par défaut et le pas vaut un. Un pas négatif permet de descendre ; un pas nul provoque une ValueError. range conserve les paramètres de la séquence plutôt que de stocker à l’avance une liste de tous ses nombres.
for value in range(1, 4):
print(value)
Ce petit exemple affiche 1, 2 puis 3, chacun sur sa ligne. Pour un pas positif, les valeurs restent strictement inférieures à la borne ; pour un pas négatif, elles restent strictement supérieures à celle-ci. Une direction incompatible avec les bornes donne une séquence vide, par exemple range(5, 0, 1). La documentation du type range détaille ces règles.
Associer noms, montants et numéros d’affichage
Le programme suivant nécessite Python 3.10 ou ultérieur, car il utilise zip(..., strict=True). Vérifiez la version avec python --version. Enregistrez le bloc complet dans for_loop.py, au format UTF-8, dans un dossier d’exercice. Avec l’environnement virtuel du projet activé, ouvrez le terminal dans ce dossier et lancez python for_loop.py. Sur macOS ou Ubuntu hors environnement virtuel, utilisez python3 si c’est le nom de votre interpréteur, pour la version comme pour l’exécution.
names = ["coffee", "lunch", "bus"]
amounts = [3500, 8000, 2500]
for number, (name, amount) in enumerate(zip(names, amounts, strict=True), start=1):
print(number, name, amount)
print(list(range(5, 0, -2)))
Le résultat attendu est :
1 coffee 3500
2 lunch 8000
3 bus 2500
[5, 3, 1]
zip forme les paires nom–montant ; enumerate ajoute leur numéro. Dans number, (name, amount), le déballage extérieur reçoit le compteur et la paire, puis le déballage intérieur sépare le nom du montant. Cette structure prolonge le déballage des tuples et des séquences. Les noms coffee, lunch et bus restent des données de l’exercice.
Contrôler les longueurs et la consommation
start=1 règle le premier numéro fourni par enumerate ; il ne modifie pas les indices de la liste. La première ligne affiche donc 1 pour coffee, alors que coffee reste à l’indice 0 dans names. Utilisez directement les valeurs déballées au lieu d’indexer la liste avec un numéro destiné à l’affichage.
Par défaut, zip s’arrête dès que l’entrée la plus courte est épuisée. Si trois noms correspondent à seulement deux montants, la troisième association disparaît silencieusement. L’option strict=True, ajoutée en Python 3.10, lève une ValueError lorsque les longueurs diffèrent. Les règles officielles de zip et enumerate expliquent ces comportements.
Ce contrôle est effectué pendant la consommation : zip produit ses paires à la demande. Une boucle peut donc avoir déjà imprimé ou traité certaines paires avant l’erreur. Ne considérez pas strict=True comme une validation préalable ou une annulation automatique des traitements. Pour deux listes dont la longueur est disponible, comparez leurs longueurs avant une opération qui doit éviter tout traitement partiel. Quand les données deviennent plus riches, regrouper les champs d’un enregistrement dans une même structure évite aussi de maintenir plusieurs listes parallèles.
Un objet zip déjà consommé ne recommence pas spontanément au début. Si vous stockez pairs = zip(names, amounts), un premier list(pairs) le consomme ; un second renvoie une liste vide. Créez un nouvel objet zip pour un nouveau parcours des listes sources.
Tester les erreurs, les bornes et les sources vides
- Retirez uniquement 2500 de
amounts, en conservant les trois noms etstrict=True. Le programme imprime les deux premières associations, puis lève uneValueError. Il n’atteint pas la dernière ligne qui affiche l’intervalle. - Avec ces mêmes données incomplètes, retirez uniquement
, strict=True. La boucle affiche deux associations sans erreur, puis[5, 3, 1]. Ce résultat apparemment normal montre la perte du troisième nom. Rétablissez ensuite le montant 2500 et l’option stricte. - Remplacez seulement
range(5, 0, -2)parrange(5, -1, -2). Le résultat reste[5, 3, 1], car -1 est exclu. Avec une borne -2, -1 serait inclus. Restaurez la borne zéro.
Si les deux listes sont vides, la boucle ne s’exécute pas, mais la dernière ligne affiche toujours l’intervalle. Initialisez avant la boucle un total ou une autre valeur que vous devrez utiliser après, au lieu de compter sur une affectation qui pourrait ne jamais avoir lieu.
Évitez aussi de supprimer des éléments de la liste que vous parcourez : le déplacement des éléments peut en faire sauter certains. Construisez un résultat filtré ou parcourez une copie si vous devez modifier l’original, comme dans les exemples de modification et copie des listes. Après les essais, restaurez les deux listes initiales et vérifiez les quatre lignes attendues.




