3.3 · Fonctions avancées : décorateurs, générateurs, lambdas, map/filter

Niveau 3 · Python intermédiaire

3.3Fonctions avancées : décorateurs, générateurs, lambdas, map/filter

Objectif : écrire du Python « pythonique » et performant.
Temps estimé : 16 min

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.
Vérifiez votre compréhension

À quoi sert un décorateur en Python ?

Fonctions avancées : décorateurs, générateurs, lambdas, map/filter
Vidéo hébergée sur YouTube — ouvrir dans un nouvel onglet ↗
Tutos décorateurs/générateurs/lambda Python (recherche FR)
Cliquer pour voir les résultats à jour ↗

En pratique — Écrire du Python pythonique

  1. Remplacez une petite fonction par une lambda passée à sorted() (ex. trier des tuples par leur 2e élément : key=lambda t: t[1]).
  2. Transformez une liste avec map(lambda x: x**2, nombres) et filtrez avec filter(lambda x: x%2==0, nombres). Comparez aux comprehensions.
  3. Écrivez un générateur avec yield qui produit les nombres pairs à l'infini ; consommez-en 10 avec une boucle et break.
  4. Créez un décorateur @chrono qui mesure et affiche le temps d'exécution d'une fonction, puis appliquez-le.
Vous maniez lambdas, map/filter, générateurs (yield) et décorateurs : vous écrivez et lisez un code Python idiomatique et efficace.

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.

Autres ressources