Tutoriel python : la fonction lambda

Table des matières

Introduction

  1. Définition:
  2. Python Lambda vs fonctions régulières
  3. les arguments et la fonction Lambda

3.1 Fonction Lambda avec plusieurs arguments

3.2 Lambdas sans arguments

  1. les usages de la fonction lambda

4.1 Exemple d’usage avec la fonction filter()

4.2 Exemple d’usage avec la fonction map ()

4.3 Utilisation de lambdas avec tri de liste

  1. Exercices
  2. Correction

Conclusion

Introduction

Bienvenue dans un nouveau tutoriel Python, aujourd’hui, nous allons découvrir une nouvelle notion, il s'agit de la fonction lambda. C’est une fonction très utilisée dans la programmation car elle permet de faciliter plusieurs tâches au développeur. Dans ce tutoriel, nous allons voir la définition de la fonction lambda, sa syntaxe en Python ainsi que la différence entre la fonction lambda et les fonctions régulières. 

Ce cours sera riche en exemples et exercices afin de vous permettre de bien comprendre cette notion. 

Il suffit de vous concentrer et de bien suivre les différentes sections. Nous pensons que maintenant vous pouvez commencer ce tutoriel ! Allons-y. 

1 - Définition: 

Une lambda Python est juste une autre méthode pour définir une fonction, Les fonctions lambda peuvent accepter zéro ou plusieurs arguments mais une seule expression.

Une fonction lambda de Python se comporte comme une fonction normale en ce qui concerne les arguments. Par conséquent, un paramètre lambda peut être initialisé avec une valeur par défaut : le paramètre n prend le n externe comme valeur par défaut. La fonction lambda de Python aurait pu être écrite comme lambda x=n : print(x) et avoir le même résultat.

La syntaxe pour définir une fonction anonyme (lambda) est donnée ci-dessous :

Lambda arguments : expression

Elle peut accepter n’importe quel nombre d’arguments et n’a qu’une seule expression. Elle est utile lorsque les objets de fonction sont requis.

Voici un exemple afin de vous familiariser avec la syntaxe en Python :

Exemple :

Plusun() est une fonction qui ajoute 1 au paramètre en entrée et retourne la somme finale. Par exemple Plusun(5)  ajoutes 1 à 5 et retourne 6. On va voir la syntaxe de la fonction normale en Python et celle en utilisant la fonction lambda.

Syntaxe :

def Plusun(x): 
... return x+1

Par ailleurs, l’utilisation d’une expression lambda permet d’obtenir l’expression suivante :

Syntaxe :

lambda x: x+1

L’expression commence par l’expression lambda suivie des paramètres, ici le paramètre est  x, puis le corps de la fonction x+1.

Afin d’utiliser la fonction, vous pouvez encercler la fonction puis l’argument avec des parenthèses comme le montre l’exemple suivant :

Syntaxe :

(lambda x: x + 1)(2)

Avant tout, la fonction lambda est une expression donc elle peut avoir un nom. Voici comment coder une fonction lambda nommée :

Syntaxe :

Plus_un = lambda x: x + 1

Résultat de l’exécution:

Exemple : carré d’un nombre

On veut calculer  le carré d'un nombre grâce à une expression lambda.

Syntaxe :

f = lambda x: x * x 
f(5)

Résultat de l’exécution:

Dans les exemples précédents, les fonctions n’ont qu’un seul argument. Généralement, les paramètres des lambdas n’ont pas de parenthèses autour. Dans le cas d’une fonction multi-arguments (fonction qui accepte plus d’un argument), on sépare ces arguments par des virgules et bien sûr sans parenthèses autour. Cette notion sera détaillée dans les sections suivantes .

Exemple : initialisation d’une variable

Si par exemple on veut initier une constante dans l’expression, voici comment faire :

Syntaxe 1 :

f = lambda x, y=2 : x + y
f(5,3)

Syntaxe 2 :

f = lambda x, y=2 : x + y
f(5)

Résultat de l’exécution:

Dans les deux cas, nous avons initié y à 2 mais pourquoi le résultat obtenue dans la première syntaxe est 8 et le deuxième 7 ?

Tout simplement,  quand on a fait appel à la fonction lambda dans le premier cas f(5,3) on a donné une valeur à y, donc la valeur initiale est annulée et le programme a  comme paramètre 5 et 3 et évidement il retourne 8 qui est la somme des deux. Par contre dans le deuxième cas on a initié que le x est donc le y prend la valeur 2 et la somme retourné sera 2.

Dans la prochaine section, nous allons voir les similarités et différences entre une fonction régulière et une fonction lambda.

2. Python Lambda vs fonctions régulières

Vous vous posez surement la question suivante : quelle est la différence entre lambda et une fonction normale ? Est-ce que lambda est uniquement une façon plus rapide pour déclarer une fonction ?  Ne vous inquiétez pas  nous avons la réponse à vos questions. Dans cette section, nous allons déterminer les différentes similarités entre ces deux ainsi que leurs différences pertinentes.

Pour identifier ces différences, nous allons nous référer à comment Python voit les fonctions régulières ainsi que celles construites autant qu’expression lambda !

Nous allons utiliser le module dis de Python qui analyser le byte code généré par le compilateur Python :

Exemple :

Nous allons utiliser l'exemple de la section d'avant de la fonction plus_un() :

Fonction lambda :

Syntaxe :

import dis
>>> plus_un = lambda x : x + 1
>>> type(plus_un)
>>> dis.dis(plus_un)
Plus_un

Résultat de l’exécution:

Fonction régulière :

Syntaxe :

import dis
>>> def plus_un(x): return x+1
>>> type(plus_un)
>>> dis.dis(plus_un)
Plus_un

Résultat de l’exécution:

Après l’exécution des deux codes, vous pouvez remarquer que Python nomme les deux fonctions différemment. Il retourne le nom de la fonction pour la fonction définie par def et lambda pour la fonction qui utilise l’expression lambda.

3. les arguments et la fonction Lambda :

3.1 Fonction Lambda avec plusieurs arguments :


Comme vous l’avez vu précédemment, il était facile de définir une fonction lambda avec un seul argument.

Mais si vous voulez définir une fonction lambda qui accepte plus d’un argument, vous pouvez séparer les arguments en entrée par des virgules.

Exemple :
Par exemple, disons que nous voulons définir une lambda qui prend deux arguments entiers et retourne leur somme.

Syntaxe :

f = lambda x ,y: x + y
f(5,3)

Résultat de l’exécution:

Exemple :

Dans cet exemple, nous voulons écrire une fonction lambda, qui représente l'équation suivante : 2x-3y+z.

Syntaxe :

f = lambda x, y, z : 2*x – 3*y +z
f(5,3,0)

Résultat de l’exécution:

Exemple : Calcul salaire total

Dans cet exemple, nous voulons calculer le salaire total d'un fonctionnaire, le système de paie attribue à chaque semaine une somme bien définie. Donc, pour calculer le salaire total nous devons écrire une fonction qui fait la somme des montants  de toute la semaine moins 20 pour 100 de tva.

Syntaxe :

paie = lambda sem1 ,sem2,sem3, sem4: (sem1+ sem2 +sem3 +sem4)-(sem1+ sem2 + sem3 + sem4)*0.2
paie (1200, 879, 1500,3000)

Résultat de l’exécution:

Et si vous voulez une lambda qui n’accepte aucun argument ?

3.2 Lambdas sans arguments :

Disons que vous voulez définir une fonction lambda qui ne prend aucun argument et retourne False.
Vous pouvez y parvenir avec le code suivant.

Syntaxe :

f = lambda: True
f()

Résultat de l’exécution:

 Exemple : l’heure actuelle

Dans cet exemple, nous voulons afficher l'heure actuelle grâce à une fonction lambda. Nous allons utiliser le module datetime qui nous permet d'abord la date actuelle. 

Syntaxe :

from datetime import datetime
f= lambda : datetime.now()
f()

Résultat de l’exécution:

Vous demanderez sûrement la question suivante : peut-on avoir une expression lambda avec plusieurs lignes ? Croyez-nous la réponse est un grand NON. la spécificité  des expressions lambda est  que cette expression ne contient qu’une seule expression.

4. les usages de la fonction lambda :

Nous utilisons des fonctions lambda lorsque nous avons besoin d’une fonction sans nom pour une courte période de temps.En Python, nous l’utilisons généralement comme argument pour une fonction d’ordre supérieur (une fonction qui prend d’autres fonctions comme arguments). Les fonctions lambda sont utilisées avec des fonctions intégrées comme filter (), map () etc.

4.1 Exemple d’usage avec la fonction filter() :

Comme son nom l’indique, filter est une autre fonction intégrée qui filtre une séquence ou tout objet itératif. En d’autres termes, étant donné tout objet itératif (comme une liste), la fonction de filter() filtre certains des éléments tout en gardant certains selon des critères. Ce critère est défini par l’appelant de filter en passant une fonction comme argument. Cette fonction est appliquée à chaque élément de l’itératif. Si la valeur de retour est True, l’élément est conservé. Sinon, l’élément est ignoré.

Par exemple, définissons une fonction très simple qui retourne True pour les nombres pairs et False pour les nombres impairs :

Syntaxe :

def parite(x):
if x % 2 == 0:
return True
return False
print(list(filter(parite, [2, 5, 6, 7, 22, 23])))

Résultat de l’exécution:

Cela dit, avec la magie des lambdas, vous pouvez faire la même chose plus succinctement. Le code ci-dessus va se transformer en une ligne.

Syntaxe :

print (list (filter (lambda x: x % 2 == 0, [2, 5, 6, 7, 22, 23]) ) )

Résultat de l’exécution:

4.2 Exemple d’usage avec la fonction map () :

Une opération commune que vous appliquerez aux listes Python est d’appliquer une opération à chaque élément. Map est une fonction Python intégrée qui prend une fonction et une séquence comme arguments et appelle ensuite la fonction d’entrée sur chaque élément de la séquence.

Exemple : 

Par exemple, supposons que nous avons une liste d’entiers et que nous voulons élever au cube  chaque élément de la liste en utilisant la fonction map .

Syntaxe :

L = [4, 3, 5, 2]
list (map (lambda x: x**3, L))

Résultat de l’exécution:

Comme vous pouvez le voir, au lieu de définir une fonction et de la passer à map comme argument, vous pouvez simplement utiliser lambdas pour définir rapidement une fonction dans les parenthèses de la carte.

Exemple :

Dans cet exemple, nous voulons calculer la racine carrée des éléments d’une liste et cela en utilisant une expression lambda.

N’oubliez pas d’importer la fonction sqrt du module numpy qui permet de calculer la racine  carrée d’un entier.


Syntaxe :

import numpy as np
L = [4, 9, 16, 25]
list(map (lambda x: np.sqrt(x), L))

Résultat de l’exécution:

Passons à  un autre cas où lambdas peut être utile.

4.3 Utilisation de lambdas avec tri de liste :

Si vous avez une liste de nombres ou de chaînes, le tri d’une liste est très simple.
Vous pouvez simplement utiliser les fonctions de tri ou de tri intégrées. Cependant, vous avez parfois une liste d’objets personnalisés et vous pouvez vouloir trier la liste en fonction d’un champ d’objet spécifique.Dans ce cas, vous pouvez passer un paramètre optionnel pour trier ou trier. Ce paramètre clé est en fait de type fonction. La fonction est appliquée à tous les éléments de la liste et la valeur de retour est ce qui va être trié. Prenons un exemple :

Exemple :

Supposons que vous avez une classe Etudiant  qui ressemble à celle-ci :

Syntaxe :

class Etudiant :
def __init__(self, name, age):
self.name = name
self.age = age

Maintenant, créons des objets Etudiant et ajoutons-les à une liste.

Etudiant_1= Etudiant ('Alex', 21)
Etudiant_2= Etudiant ('Amanda', 35)
Etudiant_3= Etudiant ('David', 18)
L = [Etudiant_1, Etudiant_2, Etudiant_3]

Maintenant, disons que nous voulons trier cette liste en fonction de l’âge des employés, voici ce que nous devrions faire :

L.sort(key=lambda x: x.age)
print([item.name for item in L])

Résultat de l’exécution:

Voyez comment nous avons utilisé une expression lambda comme paramètre clé au lieu d’avoir à définir une fonction à l’extérieur et de passer ensuite cette fonction à trier.

5. Exercices :

Exercice 1 : classe des Employés

Dans cet exercice, on veut trier des employés selon leur nombre d’heures de travail pour élire l’employé du mois, puis selon leur age. Comme dans l’exemple du cours de la classe étudiant, nous voulons utiliser une expression lambda afin de ne pas écrire beaucoup de lignes de code.

Voici la table d’employés :

Employé

Nom

Age

Nb heures de travail

1

Yassine

38

160

2

Hind

27

165

3

Kenza

23

145

4

Ali

45

180

5

Abdellah

37

144

A vous de jouer !

Exercice 2 : Bonjour n fois

On veut écrire un code qui affiche la concaténation du mot bonjour n fois. Pour vous faciliter la tâche, il suffit de traduire la fonction suivante en expression lambda :

def mot_nfois (mot,n):
""" Concatène n copies de mot."""
mots = mot * n
return mots

6. Correction :

Exercice 1 :

Nous allons tout d’abord créer la classe Employé :

class Employe:
def __init__(self, name, age, nb_heures):
self.name = name
self.age = age
self.nb_heures= nb_heures

Ensuite, nous allons instancier les objets du tableau et les mettre dans une liste :

Employe_1 = Employe ('Yassine', 38 ,160 )
Employe_2 = Employe ('Hind', 27 , 165 )
Employe_3 = Employe ('Kenza', 23 , 45 )
Employe_4 = Employe ('Ali', 45 , 180 )
Employe_5 = Employe ('Abdellah', 37,144)
L = [ Employe_1 , Employe_2 , Employe_3 , Employe_4 , Employe_5 ]

Maintenant, nous allons trier les employés selon leurs heures de travail :

L.sort (key=lambda x: x.nb_heures )
print ( [item.name for item in L] )

De même, nous allons trier les employés selon leur âge :

L.sort (key=lambda x: x.age )
print ([item.name for item in L] )

Résultat de l’exécution:

Félicitations à Ali, l’employé du mois.  Kenza il faut grandir un peu !

Exercice 2 :

Syntaxe : 

mot_nfois = (lambda mot, n: mot * n)
# on appelle mot_nfois: resultat
resultat = mot_nfois ('Bonjour', 5)
# Print resultat
print(resultat)

Résultat de l’exécution:

Conclusion :

Nous voici arrivés à la fin de ce tutoriel ! Un long voyage n’est-ce pas ? En tout cas nous pouvons vous assurer que vous êtes sur la bonne route !  Ce tutoriel vous a permis d’acquérir une notion  parmi les plus importantes en programmation.  

Cependant, il est fortement conseillé de refaire les exemples de ce tutoriel et essayer de coder de nouveaux encore plus complexes.

Bon, la route est encore longue ! Vous allez découvrir pleins d’autre notion intéressantes dans ce langage. Bon courage et à un prochain tutoriel !

Article publié le 13 Octobre 2020par Mouna HAMIM