3.3Fonctions avancées : décorateurs, générateurs, lambdas, map/filter
Ce chapitre révèle le Python « pythonique » : des outils élégants qui rendent le code plus concis et performant. Les lambdas (fonctions anonymes), map/filter, les générateurs (qui produisent des valeurs à la demande, économes en mémoire) et les décorateurs (qui enrichissent une fonction sans la modifier).
Ces notions intermédiaires sont très présentes dans le code professionnel et les frameworks (le @app.route de Flask est un décorateur !). Les comprendre vous fera passer un cap et lire couramment le code des autres.
Vocabulaire de la section
- Lambda
- Fonction anonyme d'une ligne : lambda x: x * 2. Utile pour un traitement court passé en argument.
- map / filter
- map applique une fonction à chaque élément d'une séquence ; filter n'en garde que ceux qui satisfont une condition.
- Générateur
- Fonction utilisant yield qui produit ses valeurs une à une, à la demande : mémoire minimale, idéal pour les gros flux.
- yield
- Renvoie une valeur tout en suspendant la fonction, reprise au prochain appel : le cœur des générateurs.
- Décorateur
- Fonction qui en enveloppe une autre pour lui ajouter un comportement (log, chronométrage, contrôle d'accès), via la syntaxe @decorateur.
À quoi sert un décorateur en Python ?
En pratique — Écrire du Python pythonique
- Remplacez une petite fonction par une lambda passée à sorted() (ex. trier des tuples par leur 2e élément : key=lambda t: t[1]).
- Transformez une liste avec map(lambda x: x**2, nombres) et filtrez avec filter(lambda x: x%2==0, nombres). Comparez aux comprehensions.
- Écrivez un générateur avec yield qui produit les nombres pairs à l'infini ; consommez-en 10 avec une boucle et break.
- Créez un décorateur @chrono qui mesure et affiche le temps d'exécution d'une fonction, puis appliquez-le.
Points clés à retenir
- Lambda = fonction anonyme d'une ligne, utile en argument (key de sorted…).
- Les générateurs (yield) produisent à la demande : très économes en mémoire.
- Un décorateur enrichit une fonction sans en modifier le code (@decorateur).
- Ces outils sont partout dans les frameworks : les connaître, c'est lire le code des pros.
Questions fréquentes
Quand préférer un générateur à une liste ?
Quand les données sont volumineuses ou infinies : une liste charge tout en mémoire, un générateur produit une valeur à la fois. Pour lire un fichier de plusieurs Go ligne par ligne, un générateur est indispensable ; pour quelques éléments réutilisés plusieurs fois, une liste suffit.
Un décorateur, c'est compliqué, à quoi ça sert concrètement ?
À ajouter un comportement répétitif (journalisation, mesure de temps, vérification d'authentification, mise en cache) à plusieurs fonctions sans copier ce code partout. Vous en utilisez déjà sans le savoir : @app.route en Flask, @staticmethod en POO, @pytest.fixture en tests.