Dans ce tutoriel, vous apprendrez tout sur l’utilisation des fonctions lambda en Python – de la syntaxe pour définir les fonctions lambda aux différents cas d’utilisation avec des exemples de code.

En Python, les lambdas sont des fonctions anonymes qui ont une syntaxe concise et peuvent être utilisées avec d’autres fonctions intégrées utiles. À la fin de ce tutoriel, vous aurez appris comment définir les fonctions lambda et quand vous devriez envisager de les utiliser plutôt que les fonctions Python classiques.

Commençons !

Fonction lambda Python : Syntaxe et exemples

Voici la syntaxe générale pour définir une fonction lambda en Python :

lambda paramètre(s):valeur de retour

Dans la syntaxe générale ci-dessus :

  • lambda est le mot-clé que vous devez utiliser pour définir une fonction lambda, suivi d’un ou plusieurs paramètres que la fonction doit prendre.
  • Les paramètres et la valeur de retour sont séparés par deux points.

lorsque vous définissez une fonction lambda, vous devez vous assurer que la valeur de retour est calculée en évaluant une expression qui s’étend sur une seule ligne de code. Vous comprendrez mieux cela lorsque nous coderons des exemples.

Exemples de fonctions Lambda en Python

La meilleure façon de comprendre les fonctions lambda est de commencer par réécrire les fonctions Python ordinaires en fonctions lambda.

👩🏽‍💻 Vous pouvez coder dans une REPL Python ou en utilisant ce compilateur Python en ligne.

#1. Considérez la fonction suivante square(), qui prend un nombre, num, comme argument et renvoie le carré du nombre.

def square(num) :
    return num*num

Vous pouvez appeler la fonction avec des arguments et vérifier qu’elle fonctionne correctement.

>>> square(9)
81
>>> square(12)
144

Vous pouvez assigner cette expression lambda à une variable, par exemple square1, pour rendre la définition de la fonction plus concise : square1 = lambda num : num*num, puis appeler la fonction square1 avec n’importe quel nombre comme argument. Cependant, nous savons que les lambdas sont des fonctions anonymes, vous devez donc éviter de les assigner à une variable.

Pour la fonction square(), le paramètre est num et la valeur de retour est num*num. Après les avoir identifiées, nous pouvons les insérer dans l’expression lambda et l’appeler avec un argument, comme indiqué ci-dessous :

>>> (lambda num : num*num)(2)
4

Il s’agit du concept d’expression de fonction immédiatement invoquée, dans lequel nous appelons une fonction juste après l’avoir définie.

#2. Ensuite, réécrivons une autre fonction simple add() qui prend deux nombres, num1 et num2, et renvoie leur somme, num1 num2.

def add(num1,num2) :
    return num1 num2

Appelons la fonction add() avec deux nombres comme arguments :

>>> add(4,3)
7
>>> add(12,5)
17
>>> add(12,6)
18

Dans ce cas, num1 et num2 sont les deux paramètres et la valeur de retour est num1 num2.

>>> (lambda num1, num2 : num1 num2)(3,7)
10

Les fonctions Python peuvent également prendre des valeurs par défaut pour les paramètres. Modifions la définition de la fonction add() et fixons la valeur par défaut du paramètre num2 à 10.

def add(num1, num2=10) :
    return num1 num2

Dans les appels de fonction suivants :

  • Dans le premier appel de fonction, la valeur de num1 est 1 et la valeur de num2 est 3. Lorsque vous transmettez la valeur de num2 dans l’appel de fonction, cette valeur est utilisée ; la fonction renvoie 4.
  • Toutefois, si vous ne passez qu’un seul argument(num1 est 7), la valeur par défaut de 10 est utilisée pour num2; la fonction renvoie 17.
>>> add(1,3)
4
>>> add(7)
17

Lorsque vous écrivez des fonctions qui prennent des valeurs par défaut pour certains paramètres en tant qu’expressions lambda, vous pouvez spécifier la valeur par défaut lors de la définition des paramètres.

>>> (lambda num1, num2 = 10 : num1 num2)(1)
11

Quand devriez-vous utiliser les fonctions lambda en Python ?

Maintenant que vous avez appris les bases des fonctions lambda en Python, voici quelques cas d’utilisation :

  • Lorsque vous avez une fonction dont l’expression de retour est une seule ligne de code et que vous n’avez pas besoin de référencer la fonction ailleurs dans le même module, vous pouvez utiliser les fonctions lambda. Nous avons également codé quelques exemples pour comprendre cela.
  • Vous pouvez utiliser des fonctions lambda lorsque vous utilisez des fonctions intégrées, telles que map(), filter() et reduce().
  • Les fonctions lambda peuvent être utiles pour trier les structures de données Python telles que les listes et les dictionnaires.

Comment utiliser les fonctions lambda de Python avec les fonctions intégrées ?

#1. Utiliser Lambda avec Map()

La fonction map() prend un itérable et une fonction et applique la fonction à chaque élément de l’itérable, comme indiqué :

python-lambda-with-map

Créons une liste nums et utilisons la fonction map() pour créer une nouvelle liste contenant le carré de chaque nombre de la liste nums. Remarquez l’utilisation de la fonction lambda pour définir l’opération de mise au carré.

>>> nums = [4,5,6,9]
>>> list(map(lambda num:num*num,nums))
[16, 25, 36, 81]

Comme la fonction map() renvoie un objet map, nous devons le transformer en liste.

▶️ Consultez ce tutoriel sur la fonction map de Python.

#2. Utiliser Lambda avec Filter()

Définissons nums, une liste de nombres :

>>> nums = [4,5,6,9]

Supposons que vous souhaitiez filtrer cette liste et ne conserver que les nombres impairs.

Vous pouvez utiliser la fonction intégrée filter() de Python.

La fonction filter() prend en compte une condition et un itérable: filter(condition, itérable). Le résultat ne contient que les éléments de la table itérative d’origine qui satisfont à la condition. Vous pouvez convertir l’objet retourné en un itérable Python tel qu’une liste.

python-lambda-with-filter

Pour filtrer tous les nombres pairs, nous ne conserverons que les nombres impairs. L’expression lambda devrait donc être lambda num : num%2!=0. La quantité num%2 est le reste lorsque num est divisé par 2.

  • num%2!=0 est vrai lorsque num est impair, et
  • num%2!=0 est Faux lorsque num est pair.
>>> nums = [4,5,6,9]
>>> list(filter(lambda num:num%2!=0,nums))
[5, 9]

#3. Utilisation de Lambda avec Reduce()

La fonction reduce() prend en compte un itérable et une fonction. Elle réduit l’itérable en appliquant la fonction itérativement sur les éléments de l’itérable.

python-lambda-with-reduce

Pour utiliser la fonction reduce(), vous devez l’importer à partir du module intégré functools de Python :

>>> from functools import reduce

Utilisons la fonction reduce() pour calculer la somme de tous les nombres de la liste nums. Nous définissons une expression lambda : lambda num1,num2:num1 num2, comme fonction de réduction de la somme.

L’opération de réduction se déroulera comme suit : f(f(f(4,5),6),9) = f(f(9,6),9) = f(15,9) = 24. Ici, f est l’opération de sommation sur deux éléments de la liste, définie par la fonction lambda.

>>> from functools import reduce
>>> nums = [4,5,6,9]
>>> reduce(lambda num1,num2:num1 num2,nums)
24

Si vous n’êtes pas sûr des sommes, vous pouvez consulter cette page pour comprendre la fonction sum de Python.

Fonctions lambda Python pour personnaliser le tri

En plus d’utiliser les fonctions lambda avec les fonctions intégrées de Python, telles que map(), filter() et reduce(), vous pouvez également les utiliser pour personnaliser les fonctions et méthodes intégrées utilisées pour le tri.

img

#1. Trier des listes Python

Lorsque vous travaillez avec des listes Python, vous devez souvent les trier en fonction de certains critères de tri. Pour trier les listes Python en place, vous pouvez utiliser la méthode intégrée sort(). Si vous avez besoin d’une copie triée de la liste, vous pouvez utiliser la fonction sorted().

La syntaxe pour utiliser la fonction sorted() de Python est sorted(iterable, key=...,reverse= True | False).

– Le paramètre key est utilisé pour personnaliser le tri.
– Le paramètre reverse peut être défini à True ou False; la valeur par défaut est False.

Lorsque vous triez des listes de nombres et de chaînes de caractères, le tri par défaut s’effectue respectivement dans l’ordre croissant et dans l’ordre alphabétique. Toutefois, vous pouvez parfois souhaiter définir un critère de tri personnalisé.

Considérez la liste de fruits suivante. Supposons que vous souhaitiez obtenir une copie triée de la liste. Vous devez trier les chaînes de caractères en fonction du nombre d’occurrences de “p”, dans l’ordre décroissant.

>>> fruits = ['pomme', 'ananas', 'raisin', 'mangue']

Il est temps d’utiliser le paramètre clé facultatif. Une chaîne est un itérable en Python et pour obtenir le nombre d’occurrences d’un caractère, vous pouvez utiliser la méthode intégrée .count(). Nous définissons donc la clé comme lambda x:x.count('p') afin que le tri soit basé sur le nombre d’occurrences de ‘p’ dans la chaîne.

>>> fruits = ['pomme', 'ananas', 'raisin', 'mangue']
>>> sorted(fruits,key=lambda x:x.count('p'),reverse=True)
['ananas', 'pomme', 'raisin', 'mangue']

Dans cet exemple :

  • La clé à trier est le nombre d’occurrences du caractère “p”, et elle est définie sous la forme d’une expression lambda.
  • Comme nous avons fixé le paramètre inverse à True, le tri s’effectue dans l’ordre décroissant du nombre d’occurrences de “p”.

Dans la liste des fruits, “ananas” contient 3 occurrences de “p”, et les chaînes “pomme”, “raisin” et “mangue” contiennent respectivement 2, 1 et 0 occurrences de “p”.

Comprendre le tri stable

Prenons un autre exemple. Pour le même critère de tri, nous avons redéfini la liste des fruits. Ici, “p” apparaît dans les chaînes “pomme” et “raisin” respectivement deux fois et une fois. Il n’apparaît jamais dans les chaînes ‘mangue’ et ‘melon’.

>>> fruits = ['mangue', 'pomme', 'melon', 'raisin']
>>> sorted(fruits,key=lambda x:x.count('p'),reverse=True)
['pomme', 'raisin', 'mangue', 'melon']

Dans la liste de sortie, “mangue” vient avant “melon” bien qu’ils n’aient pas tous deux le caractère “p”. Mais pourquoi en est-il ainsi ? La fonction sorted() effectue un tri stable ; ainsi, lorsque le nombre de “p” est égal pour deux chaînes de caractères, l’ordre des éléments dans la liste originale des fruits est préservé.

À titre d’exercice rapide, échangez les positions de “mango” et de “melon” dans la liste des fruits, triez la liste sur la base du même critère et observez le résultat.

▶️ Apprenez-en plus sur la façon de trier une liste en Python.

#2. Trier un dictionnaire Python

Vous pouvez également utiliser des lambdas pour trier des dictionnaires Python. Considérez le dictionnaire suivant price_dict qui contient des articles et leurs prix.

>>> price_dict = {
... lait':10,
... miel':15,
... pain':7,
... bonbons':3
... }

Pour obtenir les paires clé-valeur d’un dictionnaire sous la forme d’une liste de tuples, vous pouvez utiliser la méthode intégrée du dictionnaire .items() :

>>> price_dict_items = price_dict.items()
dict_items([('Lait', 10), ('Miel', 15), ('Pain', 7), ('Bonbons', 3)])

En Python, tous les itérables : listes, tuples, chaînes de caractères et autres, suivent l’indexation zéro. Ainsi, le premier élément est à l’index 0, le deuxième élément est à l’index 1, et ainsi de suite.

Nous aimerions trier par la valeur, qui est le prix de chaque article dans le dictionnaire. Dans chaque tuple de la liste price_dict_items, l’élément à l’index 1 est le prix. Nous définissons donc la clé comme lambda x:x<x>[1]</x>, car elle utilisera l’élément à l’index 1, le prix, pour trier le dictionnaire.

>>> dict(sorted(price_dict_items,key=lambda x:x[1]))
{'Bonbon' : 3, "Pain" : 7, "Lait" : 10, "Miel" : 15}

Dans le résultat, les éléments du dictionnaire ont été triés par ordre croissant de prix : en commençant par “Candy”, dont le prix est de 3 unités, jusqu’à “Honey”, dont le prix est de 15 unités.

▶️ Pour en savoir plus, consultez ce guide détaillé sur le tri de dictionnaires par clé et par valeur en Python.

Summing Up

Et voilà ! Vous avez appris à définir des fonctions lambda et à les utiliser efficacement avec d’autres fonctions intégrées de Python. Voici un résumé des principaux points à retenir :

  • En Python, les lambdas sont des fonctions anonymes qui peuvent recevoir plusieurs arguments et renvoyer une valeur ; l’expression à évaluer pour générer cette valeur de retour doit être une ligne de code. Elles peuvent être utilisées pour rendre les définitions de petites fonctions plus concises.
  • Pour définir une fonction Lambda, vous pouvez utiliser la syntaxe suivante : lambda paramètre(s) : valeur de retour.
  • Parmi les cas d’utilisation les plus importants, citons les fonctions map(), filter() et reduce(), ainsi que le paramètre clé permettant de personnaliser le tri des itérables Python.

Bon codage !