Menu
Français

Lambda Python : fonctions anonymes, sort key et map/filter

Ce qu'est lambda, à quoi ça sert, et la poignée d'endroits où il gagne vraiment sa place — plus quand recourir à une fonction nommée à la place.

Une fonction que tu ne prends pas la peine de nommer

La plupart des fonctions en Python sont définies avec def, ont des noms et vivent dans un fichier où elles peuvent être réutilisées. Un lambda est une alternative plus petite et anonyme — utile dans la poignée de cas où définir une fonction complète serait plus de cérémonie que ça n'en vaut la peine.

Voici la forme côte à côte :

main.py
Output
Click Run to see the output here.

Deux fonctions, toutes les deux font exactement la même chose. La version lambda tient sur une ligne parce que c'est à peu près son boulot : une fonction jetable pour un moment jetable.

Syntaxe

lambda <params>: <expression>

  • <params> est la même liste de paramètres qu'un def utiliserait — prend en charge les défauts, *args, **kwargs.
  • <expression> est une seule expression dont la valeur devient la valeur de retour.

Exemples :

main.py
Output
Click Run to see the output here.

Pas de mot-clé return. La valeur de l'expression est renvoyée implicitement.

La seule limitation

Un lambda ne peut contenir qu'une seule expression. Tu ne peux pas y mettre d'instructions :

main.py
Output
Click Run to see the output here.

Mais tu peux utiliser l'expression ternaire :

main.py
Output
Click Run to see the output here.

Si tu as besoin de plus d'une expression, c'est ton signal pour passer à def.

Là où les lambdas gagnent vraiment leur place

Un lambda affecté à une variable est presque toujours pire qu'un def nommé :

main.py
Output
Click Run to see the output here.

C'est strictement pire que def double(x): return x * 2 — même lisibilité, plus la version lambda donne aux debuggers le nom peu utile <lambda> dans les traces de pile.

Les lambdas brillent à un seul endroit : comme arguments en ligne à des fonctions d'ordre supérieur.

Clés de tri personnalisées

Le cas classique :

main.py
Output
Click Run to see the output here.

L'argument key de sorted veut une fonction qui prend un élément et renvoie la valeur à trier. Un lambda d'une ligne est exactement ça — et utiliser un def complet semblerait lourd pour quelque chose d'aussi petit.

Tu peux trier par plusieurs champs en utilisant un tuple :

main.py
Output
Click Run to see the output here.

min, max, filter, map

Même histoire — ils acceptent tous un argument fonction optionnel :

main.py
Output
Click Run to see the output here.

Pour map et filter, une compréhension de liste est généralement encore plus claire :

main.py
Output
Click Run to see the output here.

La plupart des pythonistes préfèrent les compréhensions à map/filter pour cette raison. lambda reste un bon choix naturel pour sorted, min et max où il n'y a pas de raccourci par compréhension.

Lambdas et operator

Quand ton lambda est juste « prendre une clé » ou « prendre un attribut », le module operator de Python a des alternatives plus rapides et plus claires :

main.py
Output
Click Run to see the output here.

Pas un énorme gain, mais dans du code qui importe déjà operator, ça se lit un peu plus déclarativement.

Quand revenir à def

Si l'un de ceux-là est vrai, écris un def :

  1. La logique ne rentre pas proprement dans une seule expression.
  2. Tu veux nommer la fonction parce que le nom aiderait à la lisibilité.
  3. Tu utiliserais la même logique à plus d'un endroit.
  4. La fonction a besoin d'une docstring (les lambdas ne peuvent pas en porter).

Rappelle-toi : Python n'est pas noté sur le nombre de lignes. Une fonction nommée de trois lignes se lit presque toujours mieux qu'un lambda d'une ligne dès que la logique est non triviale.

Ensuite : les décorateurs

Les lambdas passent les fonctions comme des valeurs. Les décorateurs poussent la même idée un cran plus loin : ils te laissent envelopper n'importe quelle fonction avec du comportement réutilisable — logging, chronométrage, cache, auth — avec un seul @ sur la ligne au-dessus. C'est pour la prochaine page.

Questions fréquentes

Qu'est-ce qu'un lambda en Python ?

Un lambda est une fonction anonyme courte que tu peux écrire sur une seule ligne. lambda x: x * 2 équivaut à def double(x): return x * 2, sauf sans nom. C'est surtout utile quand tu as besoin d'une minuscule fonction comme argument d'une autre fonction.

Quand utiliser lambda plutôt que def ?

Utilise lambda pour des fonctions à usage unique, à expression unique, que tu passes directement à quelque chose comme sorted, max ou filter. Pour tout ce qui a un corps plus long qu'une seule expression — ou tout ce que tu nommerais — utilise def. Les fonctions nommées sont presque toujours plus claires.

Quelles sont les limites de lambda ?

Un lambda ne peut contenir qu'une seule expression, pas d'instructions. Pas d'affectations, pas de blocs if (même si tu peux utiliser le ternaire a if cond else b), pas de logique multi-ligne. Si tu te bats contre ces limites, passe à def.

Apprendre à coder avec Coddy

COMMENCER