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 :
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'undefutiliserait — prend en charge les défauts,*args,**kwargs.<expression>est une seule expression dont la valeur devient la valeur de retour.
Exemples :
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 :
Mais tu peux utiliser l'expression ternaire :
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é :
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 :
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 :
min, max, filter, map
Même histoire — ils acceptent tous un argument fonction optionnel :
Pour map et filter, une compréhension de liste est généralement encore plus claire :
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 :
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 :
- La logique ne rentre pas proprement dans une seule expression.
- Tu veux nommer la fonction parce que le nom aiderait à la lisibilité.
- Tu utiliserais la même logique à plus d'un endroit.
- 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.