Skip to content

Expressions lambda en Python

En Python, les fonctions sont définies avec des instructions def. Vous pouvez également utiliser lambda pour créer des fonctions anonymes. Vous pouvez utiliser des expressions lambda lorsque vous devez spécifier une fonction en tant qu’argument.

Cet article décrit le contenu suivant.

  • Bases des expressions lambda
  • Expressions lambda avec if
  • PEP8 recommande de ne pas nommer les expressions lambda
  • Exemples d’expressions lambda
    • Le paramètre clé de triés (), sort (), max (), min ()
    • carte(), filtre()

Consultez l’article suivant pour les bases des fonctions en Python.

Bases des expressions lambda

La définition de la fonction par l’instruction def et l’expression lambda correspondante est la suivante.

def function_name(parameters, ...):
    return expression

function_name = lambda parameters, ...: expression

Pour plus de commodité, dans l’exemple ci-dessus, l’expression lambda se voit attribuer un nom, mais elle n’est pas recommandée dans PEP8, comme décrit plus loin.

L’exemple concret est le suivant. Vous pouvez également spécifier un argument par défaut.

def add_def(a, b=1):
    return a + b

add_lambda = lambda a, b=1: a + b

print(add_def(3, 4))
# 7

print(add_def(3))
# 4

print(add_lambda(3, 4))
# 7

print(add_lambda(3))
# 4

Expressions lambda avec if

Vous ne pouvez pas utiliser d’instructions multilignes dans les expressions lambda, mais vous pouvez utiliser des expressions conditionnelles.

get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'

print(get_odd_even(3))
# odd

print(get_odd_even(4))
# even

PEP8 recommande de ne pas nommer les expressions lambda

Si vous attribuez un nom à une expression lambda comme dans les exemples précédents, un avertissement peut apparaître avec le vérificateur de code.

Do not assign a lambda expression, use a def (E731)

PEP8 (Style Guide for Python Code) recommande que les expressions lambda soient utilisées sans nom et que def soit utilisé lors de la définition d’une fonction avec un nom.

Utilisez toujours une instruction def au lieu d’une instruction d’affectation qui lie une expression lambda directement à un identifiant :
PEP 8 — Guide de style pour le code Python | Python.org

Comme il est seulement recommandé mais pas interdit, il peut être exécuté sans aucune erreur, même si vous nommez lambda.

Exemples d’expressions lambda

Le paramètre clé de triés (), sort (), max (), min ()

La fonction intégrée triée() et la méthode de liste sort() et les fonctions intégrées max() et min() ont un paramètre clé.

Vous pouvez spécifier une fonction appliquée à chaque élément de l’objet itérable avant que chaque élément ne soit comparé pour la clé.

Prenez la fonction intégrée triée() comme exemple.

La liste des chaînes est triée par ordre alphabétique par défaut.

l = ['Charle', 'Bob', 'Alice']

l_sorted = sorted(l)

print(l_sorted)
# ['Alice', 'Bob', 'Charle']

Si vous spécifiez la fonction intégrée len() qui renvoie le nombre de caractères dans la clé d’argument, elle sera triée en fonction du nombre de caractères.

print(len('Alice'))
# 5

l_sorted_len = sorted(l, key=len)

print(l_sorted_len)
# ['Bob', 'Alice', 'Charle']

Vous pouvez utiliser une expression lambda pour appliquer n’importe quelle fonction à chaque élément et trier en fonction du résultat. Par exemple, si vous spécifiez une expression lambda pour obtenir le deuxième caractère de la clé d’argument, elle sera triée par ordre alphabétique dans le deuxième caractère.

print((lambda x: x[1])('Alice'))
# l

l_sorted_second = sorted(l, key=lambda x: x[1])

print(l_sorted_second)
# ['Charle', 'Alice', 'Bob']

carte(), filtre()

Dans map(), qui applique une fonction à tous les éléments d’un itérable, et filter(), qui extrait les éléments satisfaisant une condition, le premier argument est une fonction (objet appelable) et le deuxième argument est un objet itérable tel qu’une liste .

Si vous souhaitez spécifier une fonction (objet appelable) comme argument, l’utilisation d’une expression lambda est plus simple que de définir la fonction avec une instruction def.

Notez que la même opération que map() et filter() peut être écrite avec des compréhensions de liste et des expressions génératrices. Il est plus facile d’écrire en utilisant des compréhensions de liste et des expressions génératrices dans de nombreux cas.

carte()

Spécifiez une expression lambda qui met au carré la valeur du premier argument. Notez que map() renvoie un itérateur au lieu d’une liste en Python3.

l = [0, 1, 2, 3]

map_square = map(lambda x: x**2, l)

print(map_square)
#


print(list(map_square))
# [0, 1, 4, 9]

Si vous souhaitez obtenir une liste, vous pouvez également écrire avec la compréhension de la liste.

l_square = [x**2 for x in l]

print(l_square)
# [0, 1, 4, 9]

Si vous souhaitez obtenir un itérateur, utilisez une expression de générateur.

g_square = (x**2 for x in l)

print(g_square)
#  at 0x1072b6d00>

print(list(g_square))
# [0, 1, 4, 9]

filtre()

Spécifiez une expression lambda qui détermine les nombres pairs comme True dans le premier argument.

filter() renvoie un itérateur en Python3 comme map().

filter_even = filter(lambda x: x % 2 == 0, l)

print(list(filter_even))
# [0, 2]

Cela peut également être écrit avec des compréhensions de liste et des expressions génératrices.

l_even = [x for x in l if x % 2 == 0]

print(l_even)
# [0, 2]

Consultez l’article suivant pour plus de détails sur l’extraction d’éléments d’une liste.