Les fonctions lambda sont des fonctions anonymes que l'on définit en une ligne, là où on en a besoin. Elles sont omniprésentes dès qu'on utilise sorted, filter, map, ou des fonctions qui attendent un autre fonction en paramètre. Le TOSA Avancé les teste systématiquement.
Qu'est-ce qu'une fonction lambda ?
Une lambda est une fonction sans nom, définie en une expression unique.
Fonction classique
def carre(x):
return x ** 2
print(carre(5))Équivalent lambda
carre = lambda x: x ** 2
print(carre(5))Anatomie
lambda x, y : x + y
│ │ │
│ │ expression (le retour)
│ paramètres
mot-cléPoints à noter :
- Le mot-clé
lambdaremplacedef. - Pas de
return: l'expression après:est implicitement renvoyée. - Pas de parenthèses autour des paramètres.
- Une seule expression : pas de statements (pas de
if/elseen bloc, pas de boucle, pas deprint).
Utilisations typiques
Dans 99 % des cas, on utilise une lambda pour passer un petit comportement à une fonction qui en attend un.
Avec sorted() — le cas #1
Trier selon un critère :
mots = ["banane", "kiwi", "pomme", "fraise"]
# Par longueur
print(sorted(mots, key=lambda m: len(m)))
# Par dernière lettre
print(sorted(mots, key=lambda m: m[-1]))Tri de listes de tuples
etudiants = [("Alice", 14), ("Bob", 8), ("Charlie", 17), ("Diana", 9)]
# Par note
print(sorted(etudiants, key=lambda t: t[1]))
# Par note décroissante
print(sorted(etudiants, key=lambda t: t[1], reverse=True))Tri multi-critères avec tuple
etudiants = [
("Alice", "A", 14),
("Bob", "B", 17),
("Charlie", "A", 17),
("Diana", "B", 14),
]
# Par note décroissante, puis par nom
classement = sorted(etudiants, key=lambda t: (-t[2], t[0]))
for x in classement:
print(x)La clé lambda t: (-t[2], t[0]) renvoie un tuple : tri primaire par -note (équivalent à décroissant), secondaire par nom.
Avec filter()
nombres = [1, -2, 3, -4, 5, -6, 7]
# Ne garder que les positifs
positifs = list(filter(lambda n: n > 0, nombres))
print(positifs)Avec map()
nombres = [1, 2, 3, 4]
# Carrés
carres = list(map(lambda n: n ** 2, nombres))
print(carres)Équivalent : [n ** 2 for n in nombres].
Avec max() / min()
etudiants = [
{"nom": "Alice", "note": 14},
{"nom": "Bob", "note": 17},
{"nom": "Eve", "note": 12},
]
meilleur = max(etudiants, key=lambda e: e["note"])
print("Meilleur :", meilleur)
faible = min(etudiants, key=lambda e: e["note"])
print("Plus faible :", faible)Avec reduce() (pour culture)
Le module functools propose reduce qui agrège une liste selon une fonction binaire :
from functools import reduce
# Somme (équivalent à sum)
total = reduce(lambda a, b: a + b, [1, 2, 3, 4, 5])
print(total)
# Produit
produit = reduce(lambda a, b: a * b, [1, 2, 3, 4, 5])
print(produit)
# Maximum (équivalent à max)
plus_grand = reduce(lambda a, b: a if a > b else b, [3, 1, 4, 1, 5, 9, 2])
print(plus_grand)En pratique, sum, min, max sont préférés à reduce quand ils existent.