De la boucle Ă l’expression one-liner
Vous Ă©crivez encore des boucles for Ă rallonge pour construire vos listes en Python ? Vous avez croisĂ© ce genre de code et vous vous ĂȘtes demandĂ© comment ça marche ?
squares = [x**2 for x in range(10)]Bienvenue dans le monde des listes en comprĂ©hension (ou list comprehensions en anglais). C’est l’une des fonctionnalitĂ©s les plus Ă©lĂ©gantes de Python, et la maĂźtriser va transformer votre façon d’Ă©crire du code. Dans ce tutoriel, on va voir ensemble, Ă©tape par Ă©tape, comment les utiliser, les combiner, et surtout⊠ne pas en abuser.
1. Le problĂšme : la boucle classique
Imaginez que vous vouliez gĂ©nĂ©rer une liste des carrĂ©s des nombres de 0 Ă 9. La façon la plus naturelle quand on dĂ©bute, c’est une boucle for :
squares = []
for x in range(10):
squares.append(x ** 2)
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]Ăa fonctionne parfaitement. Mais c’est long Ă Ă©crire, et surtout⊠c’est bruyant. On a 4 lignes pour exprimer une idĂ©e simple.
Quand on lit ce code, le cerveau doit traiter la crĂ©ation de la liste vide, l’initialisation de la boucle, l’append, avant d’arriver au cĆur de l’intention : « je veux une liste de carrĂ©s ».
2. La solution : la liste en compréhension
Python nous offre une syntaxe plus concise et plus expressive :
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]Une seule ligne. L’intention est immĂ©diate : « pour chaque x dans la sĂ©rie 0-9, mets xÂČ dans la liste ». C’est plus rapide Ă Ă©crire, plus rapide Ă lire, et mĂȘme lĂ©gĂšrement plus rapide Ă exĂ©cuter.
La structure, décomposée
Une liste en comprĂ©hension suit toujours le mĂȘme schĂ©ma :
[expression for élément in itérable]
| Partie | RĂŽle |
|---|---|
expression | Ce qu’on met dans la liste (peut ĂȘtre n’importe quelle expression Python) |
for élément in itérable | La boucle qui fournit les éléments |
Exercice minute : Ăcrire une liste des cubes de 1 Ă 10. Essayez par vous-mĂȘme avant de lire la solution.
cubes = [x**3 for x in range(1, 11)]
print(cubes) # [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]Facile, non ?
3. Filtrer avec if
Le vrai super-pouvoir des listes en comprĂ©hension, c’est la possibilitĂ© d’ajouter une condition de filtrage. Reprenons notre liste de carrĂ©s, mais cette fois on ne veut garder que les nombres pairs :
# Version boucle
even_squares = []
for x in range(10):
if x % 2 == 0:
even_squares.append(x ** 2)
# Version compréhension
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64]La syntaxe complĂšte devient :
[expression for élément in itérable if condition]
Le if se place aprĂšs la boucle, et avant la fin des crochets. Simple et logique.
Cas pratique : filtrer les mots d’une phrase
phrase = "Python est un langage de programmation formidable et puissant"
mots_long = [mot for mot in phrase.split() if len(mot) > 7]
print(mots_long) # ['programmation', 'formidable', 'puissant']En une ligne, on a splittĂ© la phrase, parcouru chaque mot, filtrĂ© ceux de plus de 7 lettres, et construit la liste. Essayez de faire ça en 4 lignes avec une boucle â c’est possible, mais moins Ă©lĂ©gant.
4. Les boucles imbriquées (et quand les utiliser)
On peut aussi avoir plusieurs for dans une mĂȘme comprĂ©hension. C’est l’Ă©quivalent d’une boucle imbriquĂ©e :
# Version boucle
pairs = []
for x in [1, 2, 3]:
for y in [10, 20, 30]:
pairs.append((x, y))
# Version compréhension
pairs = [(x, y) for x in [1, 2, 3] for y in [10, 20, 30]]
print(pairs)
# [(1, 10), (1, 20), (1, 30), (2, 10), (2, 20), (2, 30), (3, 10), (3, 20), (3, 30)]â ïž Attention : DĂšs qu’on dĂ©passe deux boucles, une comprĂ©hension devient difficile Ă lire. Dans ce cas, prĂ©fĂ©rez une boucle classique. La lisibilitĂ© prime toujours !
5. Compréhensions avec condition ternaire
On peut aussi utiliser un opĂ©rateur ternaire dans l’expression pour un traitement conditionnel :
# "pair" si pair, "impair" sinon
labels = ["pair" if x % 2 == 0 else "impair" for x in range(6)]
print(labels) # ['pair', 'impair', 'pair', 'impair', 'pair', 'impair']Attention Ă ne pas confondre avec le if filtrant ! La rĂšgle est simple :
[x for x in liste if condition]â filtre les Ă©lĂ©ments[vrai if condition else faux for x in liste]â transforme chaque Ă©lĂ©ment
6. Aller plus loin : dictionnaire et set en compréhension
Le mĂȘme principe existe pour les dictionnaires et les ensembles :
# Dictionnaire : {clé: valeur for élément in itérable}
carrés = {x: x**2 for x in range(5)}
print(carrés) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# Set (ensemble) : {expression for élément in itérable}
nombres = [1, 2, 2, 3, 3, 3, 4]
pairs_uniques = {x for x in nombres if x % 2 == 0}
print(pairs_uniques) # {2, 4}Les dictionnaires en compréhension sont particuliÚrement utiles pour transformer des données ou créer des index rapidement.
7. PiÚges à éviter
â Trop de complexitĂ©
Si votre compréhension tient sur 2-3 lignes, vous pouvez le faire, mais devriez-vous ?
# Ă ĂVITER â trop complexe
result = [[w.upper() for w in s.split() if len(w) > 3] for s in phrases if s.strip()]
# MIEUX â plus lisible
result = []
for s in phrases:
if s.strip():
mots = [w.upper() for w in s.split() if len(w) > 3]
result.append(mots)â NĂ©gliger la mĂ©moire
Une liste en comprĂ©hension construit toute la liste en mĂ©moire d’un coup. Pour des gros volumes, prĂ©fĂ©rez un gĂ©nĂ©rateur :
# Liste â tout en mĂ©moire
squares_list = [x**2 for x in range(1_000_000)]
# GĂ©nĂ©rateur â paresseux (Ă©valuĂ© Ă la demande)
squares_gen = (x**2 for x in range(1_000_000)) # Notez les parenthĂšses !
â Effets de bord
Une comprĂ©hension est faite pour construire une liste, pas pour exĂ©cuter des actions avec effets de bord (comme print() ou Ă©crire dans un fichier). Si vous avez besoin d’effets de bord, utilisez une boucle for.
8. Exercice récapitulatif
Mettez en pratique tout ce que vous avez appris :
- Facile : Générez une liste des 10 premiers multiples de 3.
- Moyen : Ă partir d’une liste de tempĂ©ratures en Celsius, convertissez-les en Fahrenheit. Formule :
F = C Ă 9/5 + 32. - AvancĂ© : Ă partir d’une chaĂźne contenant des mots sĂ©parĂ©s par des espaces, crĂ©ez un dictionnaire qui associe chaque mot unique Ă sa longueur.
Solutions (cliquez pour déplier)
# 1. Multiples de 3
[x * 3 for x in range(1, 11)]
# 2. Celsius vers Fahrenheit
celsius = [0, 10, 20, 30, 37, 100]
[c * 9/5 + 32 for c in celsius]
# Résultat : [32.0, 50.0, 68.0, 86.0, 98.6, 212.0]
# 3. Mot â longueur
phrase = "Python est un langage puissant et expressif"
{mot: len(mot) for mot in phrase.split()}
# Résultat : {'Python': 6, 'est': 3, 'un': 2, ...}
Ce qu’il faut retenir
- â Les listes en comprĂ©hension rendent le code plus concis et plus expressif
- â
On peut filtrer avec
ifet transformer avec des expressions - â Dictionnaires et sets ont leur propre syntaxe en comprĂ©hension
- â La lisibilitĂ© passe avant la concision â 2 boucles max, pas de logique trop complexe
- â Pour les grands volumes, pensez aux gĂ©nĂ©rateurs plutĂŽt qu’aux listes
MaĂźtriser les comprĂ©hensions, c’est adopter un style Pythonique qui fait la diffĂ©rence entre un code qui « marche » et un code qui se lit comme une phrase. C’est exactement le genre de compĂ©tence qu’on travaille et consolide dans nos formations pratiques.
Et vous ? Quelle est votre utilisation prĂ©fĂ©rĂ©e des listes en comprĂ©hension ? Un cas oĂč ça vous a sauvĂ© des lignes de code ? Racontez-nous en commentaire ! đ
Photo de Myburgh Roux sur Pexels.
Envie d’aller plus loin ? DĂ©couvrez nos formations pratiques pour maĂźtriser Python et le dĂ©veloppement â avec un vrai formateur qui vous guide pas Ă pas.