lambda vs def
lambda crée une fonction anonyme à une seule expression ; def définit une fonction nommée avec plusieurs instructions possibles, valeurs par défaut et docstring.
Comparaison point par point
#Nombre d’instructions dans le corps
- lambda
- Une seule expression
- def
- N’importe quel nombre d’instructions
Le mot return
- lambda
- Interdit, le résultat est automatique
- def
- Obligatoire pour renvoyer une valeur
Nom de la fonction
- lambda
- Aucun, apparaît comme
<lambda> - def
- Nom propre, visible dans les traces d’erreur
Docstring
- lambda
- Non
- def
- Oui
Assignation à une variable
- lambda
- Possible, mais déconseillée pour une logique complexe
- def
- Façon standard de définir une fonction
Usage typique
- lambda
- Argument court, par ex. key= dans sorted()
- def
- Logique réutilisable, fonctions plus longues
Exemple
#students = [("Léa", 92), ("Lucas", 78)]
by_score_lambda = sorted(students, key=lambda s: s[1], reverse=True)
def by_score(student):
return student[1]
by_score_def = sorted(students, key=by_score, reverse=True)
print(by_score_lambda)
print(by_score_lambda == by_score_def)Définition et utilisation
#Les deux créent une fonction que vous pouvez appeler, transmettre comme argument ou assigner à une variable. Dans les deux cas, les paramètres fonctionnent de la même façon : positionnels, nommés, avec des valeurs par défaut.
Elles diffèrent par ce qu’elles peuvent contenir. Après lambda se trouve une seule expression, dont le résultat est renvoyé automatiquement, sans le mot return et sans place pour des instructions conditionnelles ou des boucles. def ouvre un bloc indenté qui peut contenir n’importe quel nombre d’instructions, avec ses propres return, if et boucles, ainsi qu’une docstring. Une fonction avec def a son propre nom, qui apparaît dans les traces d’erreur, alors qu’une lambda y apparaît comme <lambda>.
Utilisez lambda quand la fonction est courte et nécessaire à un seul endroit, le plus souvent comme argument, par ex. key= dans sorted() ou une fonction dans map(). Utilisez def quand la logique est plus longue, tient sur plus d’une ligne, devrait avoir un nom et une docstring, ou quand vous l’utilisez à plusieurs endroits.
Syntaxe
#lambda params: expression
def name(params):
return valuePlus d’exemples
#describe = lambda score: "réussi" if score >= 60 else "échoué"
print(describe(75))
print(describe(40))def divide(a, b):
return a / b
divide_lambda = lambda a, b: a / b
print(divide.__name__)
print(divide_lambda.__name__)Bonnes pratiques
#- Si une lambda devient longue ou imbriquée, remplacez-la par une fonction ordinaire avec
def. Elle sera plus lisible et plus facile à tester. - Pour trier selon un champ, envisagez aussi
operator.itemgetter(1)ouoperator.attrgetter("points")à la place d’une lambda. - N’assignez pas une lambda à une variable juste pour lui donner un nom (
f = lambda x: x + 1). Il vaut mieux écrire directementdef f(x): return x + 1.
Entrées associées
#Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.