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

Exemple
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édiaire

Même syntaxe, quatre résultats de nature différente selon les délimiteurs.

Filtrer puis trier puis formater

Exemple
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édiaires

Pourquoi : 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.