Explication de la leçon
Après cette leçon, tu seras capable de :
sum(), any() ou all() sans créer de liste intermédiaire.Une compréhension de liste crée immédiatement une liste de résultats :
adjusted = [score + 5 for score in scores]Une expression génératrice utilise des parenthèses au lieu de crochets. Elle décrit des valeurs à produire lorsqu'un itérateur les demande, plutôt que de créer la liste de résultats immédiatement :
adjusted = (score + 5 for score in scores)Utilise ceci lorsqu'une opération peut traiter les valeurs une à une—par exemple sum(), any() ou all(). Tu peux transmettre l'expression directement dans une fonction. Pour un argument de générateur unique, les parenthèses extérieures du générateur peuvent souvent être omises : sum(x * 2 for x in values).
Contrairement à une liste, un générateur est à passage unique. Après l'avoir consommé, itérer à nouveau sur le même générateur ne produit aucune valeur. Si tu as besoin des valeurs plusieurs fois, utilise une compréhension de liste, matérialise le générateur avec list(), ou crée un nouveau générateur pour chaque passage.
any() et all() peuvent s'arrêter prématurément : any() s'arrête au premier élément truthy, et all() s'arrête au premier élément falsy. Les règles pour les entrées vides restent les mêmes que dans la leçon précédente (any est faux ; all est vrai). Les expressions génératrices sont particulièrement naturelles pour les vérifications à passage unique.
base_prices = [12, 20, 8]
total = sum(price * 2 for price in base_prices)
print(f"Total: {total}")Sortie :
Total: 80La multiplication est évaluée au fur et à mesure que sum() demande chaque élément ; aucune liste séparée de prix doublés n'est requise.
readings = [18, -1, 24, 0]
valid_total = sum(value for value in readings if value >= 0)
print(valid_total)Sortie :
42Le if exclut les relevés négatifs invalides du calcul tout en préservant un zéro valide.
labels = ["ready", "paused", "ready"]
has_pause = any(label == "paused" for label in labels)
print(f"Paused: {has_pause}")Sortie :
Paused: Trueany() peut se terminer dès que le générateur fournit une première correspondance.
values = (part.upper() for part in ["a", "b"])
print(list(values))
print(list(values))Sortie :
['A', 'B']
[]Le second passage est vide car values a été consommé. Utilise une liste si les deux passages doivent contenir des résultats.
| Besoin | Approche recommandée |
|---|---|
| Conserver les résultats pour réutilisation | [expression for item in items] |
| Traiter les résultats une seule fois | (expression for item in items) |
| Agréger des valeurs | sum(expression for item in items) |
| Vérifier au moins une correspondance | any(predicate for item in items) |
| Vérifier chaque valeur | all(predicate for item in items) |
| Réutiliser les résultats plus tard | Matérialiser avec list(...), ou recréer le générateur |
all() sur un générateur vide comme une preuve qu'un lot contenait des vérifications.sum(), any() ou all() lorsqu'un générateur est plus clair.