Retour au cours

itérer avec range, enumerate et zip

dans cette leçon, vous allez apprendre à utiliser range pour générer des suites de nombres, enumerate pour avoir index + valeur, et zip pour combiner plusieurs séquences.

objectifs

  • générer des nombres avec range(start, stop, step)
  • itérer avec index et valeur via enumerate
  • synchroniser plusieurs itérables avec zip
  • comprendre les limites et bonnes pratiques

range : générer des entiers

range produit une séquence d’entiers de start inclus à stop exclu, avec un step optionnel.

for i in range(5):         # 0,1,2,3,4
    print(i)

for i in range(2, 7):      # 2..6
    print(i)

for i in range(10, 0, -2): # 10, 8, 6, 4, 2
    print(i)

convertir en liste si besoin :

list(range(3))     # [0, 1, 2]

enumerate : index + valeur

enumerate fournit un compteur et la valeur correspondante.

fruits = ["pomme", "banane", "cerise"]
for i, fruit in enumerate(fruits):
    print(i, fruit)

démarrer l’index ailleurs :

for i, fruit in enumerate(fruits, start=1):
    print(f"{i}. {fruit}")

zip : itérer en parallèle

zip regroupe élément par élément plusieurs séquences.

noms = ["ana", "bob", "chris"]
scores = [15, 18, 12]

for nom, score in zip(noms, scores):
    print(f"{nom}: {score}")

si les longueurs diffèrent, zip s’arrête au plus court :

list(zip([1, 2], [10, 20, 30]))  # [(1, 10), (2, 20)]

pour aller au plus long avec valeurs manquantes, utilisez itertools.zip_longest.

from itertools import zip_longest
for a, b in zip_longest([1, 2], [10, 20, 30], fillvalue=None):
    print(a, b)

combiner enumerate et zip

for i, (nom, score) in enumerate(zip(noms, scores), start=1):
    print(f"{i}. {nom}: {score}")

bonnes pratiques

  • préférez enumerate à range(len(...)) quand vous avez besoin des valeurs
  • utilisez zip pour éviter de gérer manuellement plusieurs index
  • déstructurez les tuples (a, b) directement dans la boucle
  • si besoin de l’index + valeur + autre séquence, combinez enumerate et zip

mini exemples exécutables

# table de multiplication 1..3
for i in range(1, 4):
    for j in range(1, 4):
        print(f"{i}x{j}={i*j}", end="  ")
    print()
# affichage numéroté
tasks = ["manger", "coder", "dormir"]
for i, task in enumerate(tasks, start=1):
    print(f"{i}) {task}")
# associer noms et scores
noms = ["alice", "bob"]
scores = [8, 12]
for nom, score in zip(noms, scores):
    print(f"{nom}: {score}")
# comparer listes avec zip_longest
a = [1, 2, 3]
b = ["a", "b"]
from itertools import zip_longest
for x, y in zip_longest(a, b, fillvalue="?"):
    print(x, y)

pièges courants

  • oublier que range exclut le stop
  • boucler avec range(len(seq)) alors qu’un enumerate est plus clair
  • oublier de déstructurer (x, y) renvoyé par zip
  • penser que zip remplit avec None → il s’arrête au plus court

exercices

  1. indices pairs afficher uniquement les éléments d’une liste aux indices pairs avec enumerate.

  2. correspondance produits/prix deux listes : produits, prix. afficher produit: prix € avec zip.

  3. produit cartésien créer toutes les combinaisons (x, y) pour x dans ["a", "b"] et y dans [1, 2, 3] avec une double boucle for.

  4. index et deux séquences afficher un tableau numéroté nom: score en combinant enumerate et zip.

  5. fusion listes de tailles différentes associer deux listes de tailles différentes avec zip_longest, en remplissant les manques par "n/a".