Bases & algorithmique · 6 mondes · 18 étapes
Python avancé
Le langage lui-même : texte, compréhensions, objets, erreurs, modules.
Progression
0 %
0/18 étapes terminées
Intermédiaire · 8 min de lecture
Les compréhensions
Dire ce qu'on veut, pas comment l'obtenir
1Définition
Une compréhension construit une collection à partir d'une autre en une expression : [expression for element in source if condition]. Elle existe pour les listes, les dictionnaires, les ensembles, et en version paresseuse avec les parenthèses (générateur).
2Principes fondamentaux
01
Transformer, filtrer, ou les deux
L'expression transforme, le if filtre. Les deux ensemble couvrent l'immense majorité des boucles d'accumulation.
02
La lisibilité d'abord
Une compréhension qui dépasse la ligne, ou qui empile deux if et une imbrication, doit redevenir une boucle.
03
Les générateurs économisent la mémoire
sum(x * 2 for x in grande_liste) ne construit aucune liste intermédiaire : les valeurs sont produites une à une.
04
Pas d'effet de bord
Une compréhension sert à produire une valeur. Si le corps fait autre chose (afficher, écrire), c'est une boucle qu'il faut.
3Exemples pratiques
Les trois formes
1scores = [12, 45, 7, 88]2 3liste = [s * 2 for s in scores] # [24, 90, 14, 176]4dico = {f"j{i}": s for i, s in enumerate(scores)}5ensemble = {s % 10 for s in scores} # chiffres des unités, sans doublon6generateur = sum(s for s in scores if s > 10) # 145, sans liste intermédiaireMême syntaxe, quatre résultats de nature différente selon les délimiteurs.
Filtrer puis trier puis formater
1fiches = [("ana", 1700), ("bo", 4200), ("cy", 900)]2 3retenus = sorted([f for f in fiches if f[1] >= 1000], key=lambda f: f[1], reverse=True)4lignes = [f"{r}. {nom} - {score}" for r, (nom, score) in enumerate(retenus, start=1)]5print(lignes) # ['1. bo - 4200', '2. ana - 1700']Trois opérations, trois expressions, aucune boucle explicite — et chaque étape se lit indépendamment.
4Erreurs courantes
Compréhension pour un effet de bord
À éviter
[print(s) for s in scores]À faire
for s in scores: print(s)Pourquoi : La première construit une liste de None inutile. Une compréhension produit une valeur ; sinon, c'est une boucle.
Oublier que range commence à zéro
À éviter
[n * n for n in range(4)] # attendu [1, 4, 9, 16]À faire
[n * n for n in range(1, 5)]Pourquoi : range(4) donne 0, 1, 2, 3. La borne haute est exclue, la basse vaut zéro par défaut.
Illisible à force de concision
À éviter
[f(x) for s in liste for x in s if g(x) if h(x)]À faire
# une boucle, avec des noms et des étapes intermédiairesPourquoi : Trois niveaux dans une ligne : personne ne le relit, toi compris.
5Subtilités à connaître
- ◆La variable d'une compréhension est locale : elle ne fuit pas dans le code environnant, contrairement à une boucle
for. - ◆
sorted()est stable : trier par score après avoir trié par nom conserve l'ordre alphabétique entre ex æquo. - ◆
zip()s'arrête à la plus courte des collections : c'est silencieux, et c'est une source de données perdues.
6Vérifie ta compréhension
Question 1/3
Score 0
Que produit [s for s in scores if s > 10] ?
Envie d'essayer ? Ouvre le Labo et recopie les exemples pour les modifier.