logo oujood
🔍

Les expressions lambda en Python

Une expression lambda est une fonction anonyme à usage unique. Elle évite de définir une fonction complète avec def quand on n'a besoin que d'une seule expression.

OUJOOD.COM

Syntaxe d'une expression lambda

Une expression lambda se définit avec le mot-clé lambda, suivi des paramètres, d'un deux-points, puis d'une seule expression. Elle retourne implicitement le résultat de cette expression — pas besoin de return.

  📋 Copier le code

# Syntaxe générale
lambda paramètres: expression
# Équivalent avec def :
def anonymous(paramètres):
    return expression

La différence avec def : la lambda n'a pas de nom et ne peut contenir qu'une seule expression. Elle est conçue pour les cas où on a besoin d'une fonction simple, à un seul endroit.

Passer une lambda comme argument

En Python, une fonction peut recevoir une autre fonction en argument. C'est là que les lambdas sont particulièrement utiles : elles évitent de définir une fonction nommée pour un usage ponctuel.

Voici une fonction get_nom_complet() qui accepte un formateur en troisième argument. Sans lambda, on doit d'abord définir deux fonctions séparées :

  📋 Copier le code

def get_nom_complet(prenom, nom, formateur):
    return formateur(prenom, nom)
# Deux fonctions formateur définies séparément
def prenom_nom(prenom, nom):
    return f"{prenom} {nom}"
def nom_prenom(prenom, nom):
    return f"{nom}, {prenom}"
print(get_nom_complet('John', 'Doe', prenom_nom))  # John Doe
print(get_nom_complet('John', 'Doe', nom_prenom))  # Doe, John

Avec des lambdas, on passe directement la logique sans définir de fonctions intermédiaires :

  📋 Copier le code

def get_nom_complet(prenom, nom, formateur):
    return formateur(prenom, nom)
# Lambda passée directement en argument
print(get_nom_complet('John', 'Doe', lambda p, n: f"{p} {n}"))
# John Doe
print(get_nom_complet('John', 'Doe', lambda p, n: f"{n}, {p}"))
# Doe, John

Retourner une lambda depuis une fonction

Une fonction peut aussi retourner une lambda. C'est utile pour créer des fonctions spécialisées à la volée. Dans l'exemple suivant, fois(n) retourne une fonction qui multiplie par n.

  📋 Copier le code

def fois(n):
    return lambda x: x * n  # retourne une fonction qui multiplie par n
# triple est maintenant une fonction qui multiplie par 3
triple = fois(3)
print(triple(3))   # 9
print(triple(8))   # 24
# On peut aussi stocker le résultat dans une variable
x = triple(8)
print(x)           # 24

Piège classique : lambda dans une boucle

Une erreur fréquente consiste à créer des lambdas dans une boucle en espérant capturer la valeur de l'itérateur à chaque tour. Le résultat est souvent surprenant :

  📋 Copier le code

appellables = []
for i in (1, 2, 3):
    appellables.append(lambda: i)  # chaque lambda référence i, pas sa valeur
for f in appellables:
    print(f())
# Résultat obtenu : 3, 3, 3 (et non 1, 2, 3)

Le problème : toutes les lambdas pointent vers la même variable i. Au moment où on les appelle, la boucle est terminée et i vaut 3. Pour capturer la valeur courante, on utilise un argument par défaut :

  📋 Copier le code

appellables = []
for i in (1, 2, 3):
    appellables.append(lambda a=i: a)  # a=i capture la valeur au moment de la création
for f in appellables:
    print(f())
# Résultat correct : 1, 2, 3

En définissant a=i comme valeur par défaut, Python évalue i au moment où la lambda est créée, pas au moment où elle est appelée.

Par carabde | Mis à jour le 24 avril 2026