%% 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 %%