%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %% > [!nav] > ↩ [[Code et Développement/Programmation/Lecture de Code - Python/Lecture de code - Python|Accueil · Lecture de code - Python]] > > | [[Code et Développement/Programmation/Lecture de Code - Python/14_modules\|← Modules]] | | > |:---|---:| %% nav-fin %% # Compréhensions Une compréhension construit une liste, un ensemble ou un dictionnaire en une seule ligne. --- ## Compréhension de liste ```python # Forme générale [expression for variable in iterable if condition] ``` ```python # Sans filtre carres = [x**2 for x in range(1, 6)] # carres vaut [1, 4, 9, 16, 25] # Avec filtre pairs = [x for x in range(10) if x % 2 == 0] # pairs vaut [0, 2, 4, 6, 8] # Transformation de chaîne mots = ["Bonjour", "monde"] minuscules = [m.lower() for m in mots] # minuscules vaut ['bonjour', 'monde'] ``` La même liste construite avec une boucle : ```python # Cette compréhension... carres = [x**2 for x in range(1, 6)] # ...est équivalente à : carres = [] for x in range(1, 6): carres.append(x**2) ``` --- ## Compréhension imbriquée ```python # Table de multiplication 3×3 table = [i * j for i in range(1, 4) for j in range(1, 4)] # table vaut [1, 2, 3, 2, 4, 6, 3, 6, 9] # Aplatir une liste de listes matrice = [[1, 2], [3, 4], [5, 6]] plat = [x for ligne in matrice for x in ligne] # plat vaut [1, 2, 3, 4, 5, 6] ``` --- ## Compréhension d'ensemble ```python # Lettres uniques d'un mot, en majuscules lettres = {c.upper() for c in "abracadabra"} print(sorted(lettres)) # affiche ['A', 'B', 'C', 'D', 'R'] ``` L'ordre d'affichage d'un ensemble n'est pas garanti : `sorted` donne une sortie prévisible. --- ## Compréhension de dictionnaire ```python # Carré de chaque entier carres = {x: x**2 for x in range(1, 6)} # carres vaut {1: 1, 2: 4, 3: 9, 4: 16, 5: 25} # Inverser clés et valeurs d = {"a": 1, "b": 2, "c": 3} inv = {v: k for k, v in d.items()} # inv vaut {1: 'a', 2: 'b', 3: 'c'} ``` --- ## Expression génératrice Une expression génératrice s'écrit comme une compréhension de liste, entre parenthèses. Ses valeurs sont calculées une à une, à la demande, sans être stockées. ```python gen = (x**2 for x in range(1000000)) # parenthèses, et non crochets next(gen) # vaut 0 next(gen) # vaut 1 # Usage typique : passer directement à sum, max ou min total = sum(x**2 for x in range(1, 11)) # total vaut 385 ``` --- ## Compréhension ou boucle Préférez une compréhension quand la logique tient en une ligne claire. Préférez une boucle quand il y a plusieurs opérations ou effets de bord. ```python # Une seule opération : compréhension positifs = [x for x in lst if x > 0] # Plusieurs opérations : boucle result = [] for x in lst: y = traitement_complexe(x) if y is not None: result.append(y) ``` ## À vous **À manipuler :** prédisez la sortie, ligne par ligne. ```sq-affiche lst = [3, -1, 4, -2, 5] print([x for x in lst if x > 0]) print([x * 2 for x in lst[:2]]) print(sum(x for x in lst if x < 0)) --- saisie: lignes réponse: [3, 4, 5]\n[6, -2]\n-3 explication: la condition if filtre les éléments. lst[:2] vaut [3, -1]. Les négatifs sont -1 et -2, leur somme vaut -3. ``` ```sq-affiche mots = ["chat", "ane", "zebre"] d = {m: len(m) for m in mots} print(d) print([m[0] for m in mots if len(m) > 3]) --- saisie: lignes réponse: {'chat': 4, 'ane': 3, 'zebre': 5}\n['c', 'z'] explication: la compréhension de dictionnaire associe chaque mot à sa longueur. La seconde ne garde que les mots de plus de 3 lettres. ``` %% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %% > [!nav] > ↩ [[Code et Développement/Programmation/Lecture de Code - Python/Lecture de code - Python|Accueil · Lecture de code - Python]] > > | [[Code et Développement/Programmation/Lecture de Code - Python/14_modules\|← Modules]] | | > |:---|---:| %% nav-fin %%