ComparaisonComparaisons

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.

Sur cette page

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

#
Python
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)
Résultatrésultat enregistré, vous pouvez le vérifier
[('Léa', 92), ('Lucas', 78)]
True

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

#
Syntaxe
lambda params: expression

def name(params):
    return value

Plus d’exemples

#
lambda ne peut contenir qu’une seule expression
Python
describe = lambda score: "réussi" if score >= 60 else "échoué"
print(describe(75))
print(describe(40))
Résultatrésultat enregistré, vous pouvez le vérifier
réussi
échoué
def a un nom visible dans le code, pas lambda
Python
def divide(a, b):
    return a / b

divide_lambda = lambda a, b: a / b

print(divide.__name__)
print(divide_lambda.__name__)
Résultatrésultat enregistré, vous pouvez le vérifier
divide
<lambda>

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) ou operator.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 directement def f(x): return x + 1.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.