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.