Aller au contenu principal

Lambdas et petits objets appelables

Une expression lambda crée une fonction anonyme contenant une seule expression :

by_last_name = lambda person: person.last_name.casefold()
people.sort(key=by_last_name)

Elle convient surtout à un court objet appelable transmis directement à une API, notamment à un argument key=. Une fonction nommée est plus claire si la logique exige documentation, annotations, réutilisation, plusieurs étapes ou des traces d'erreur parlantes.

records.sort(key=lambda row: (row.priority, row.created_at))

Préférez les compréhensions ou expressions génératrices pour les transformations et filtres ordinaires :

active_names = [user.name for user in users if user.active]
total = sum(order.amount for order in orders)

Elles expriment généralement mieux l'intention que l'imbrication de map, filter et lambdas. map reste utile lorsqu'un objet appelable nommé exprime déjà l'opération.

Frontière des fermetures

Les fonctions capturent des noms, dont la valeur est recherchée à l'exécution. Créer des rappels dans une boucle comporte donc un piège de liaison tardive :

callbacks = [lambda: index for index in range(3)]
# Chaque rappel renvoie 2.

Capturez explicitement la valeur courante si tel est le contrat voulu :

callbacks = [lambda index=index: index for index in range(3)]

L'argument par défaut est évalué lors de la création de chaque fonction. Pour des rappels plus importants, une petite fabrique ou functools.partial est plus facile à expliquer.

La syntaxe lambda ne signale pas la pureté fonctionnelle. Une lambda peut appeler des fonctions avec état et modifier des objets comme une fonction nommée.

Sources

Explorer les liens

Cette note n’a pas encore de liens vers d’autres notes.

Sur les mêmes sujets (46)

Ouvrir le réseau