Prépa Python

Avancé — chapitre 31 sur 54

Les fonctions lambda

Fonctions anonymes et usage avec sorted, filter, map

65 minAbonnés

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

python
def carre(x):
    return x ** 2

print(carre(5))

Équivalent lambda

python
carre = lambda x: x ** 2

print(carre(5))

Anatomie

text
lambda  x, y   :   x + y
  │     │         │
  │     │         expression (le retour)
  │     paramètres
  mot-clé

Points à noter :

  • Le mot-clé lambda remplace def.
  • 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/else en bloc, pas de boucle, pas de print).

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 :

python
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

python
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

python
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()

python
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()

python
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()

python
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 :

python
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.

Suite réservée aux abonnés

Débloquez l'intégralité du parcours

Les 54 chapitres, les exercices corrigés automatiquement, les examens blancs et le suivi de votre progression.

Voir les offresChapitres en accès libre

Déjà un accès ? Connectez-vous.