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 une docstring, des annotations de type, une 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 (48)

Ouvrir le réseau