Le traitement des données en Big Data est crucial pour pouvoir en tirer profit. Les data scientist, les data analyst ainsi que tous ceux qui œuvrent dans ce domaine en fait leurs principales tâches. Les fonctions lambda en Python les apportent un grand coup de pouce dans l’accomplissement de celles-ci.

Ces fonctions sont comme toutes autres fonctions normales de python, mais n’admet pas de nom lors de sa définition. Avec elles, vous pouvez écrire des programmes Python plus ordonnés et ainsi accélérer vos tâches d’apprentissage automatique.

Dans ce tutoriel exhaustif, nous allons aborder plus en détails les fonctions lambda pour que vous puissiez par la suite l’utiliser au sein de vos programmes.

Qu’est-ce la fonction Lambda en Python ?

La fonction lambda est une petite fonction contenant qu’une seule expression. Elle peut agir sous anonymat parce qu’elle ne nécessite aucun nom. Elles sont très utiles lorsqu’il faut effectuer des petites tâches avec moins de code. Ce qui est très pratique lorsqu’on élabore des solutions Big Data.

Si vous voulez passer d’une petite fonction à une autre, vous pouvez également utiliser la fonction Lambda. Pas d’inquiétude sur comment ça se passe, nous en parlerons dans la suite de l’article.

Pour la première fois en 1930, Alonzo Church a introduit la fonction Lambda. Cet homme est bien connu pour le calcul de Lambda et la thèse de Church-Turing.

On retrouve les fonctions lambda dans plusieurs langages de programmation. Elles sont très pratiques, mais dans cet article, nous nous concentrons ici sur leur utilisation en Python. Voici la syntaxe de la fonction lambda en Python :

La fonction lambda a trois différentes parties :

  • Mot-clé
  • Variable/argument lié, et
  • Corps ou expression

Le mot-clé est obligatoire et ne peut être que “lambda”, mais les variables et les corps peuvent être changés en fonction des exigences. 

Quelle est la différence entre les fonctions lambda et les fonctions régulières ?

lambda python vs fonction régulière

Les fonctions lambda sont définies dans l’ensemble par le mot-clé lambda et elles peuvent comporter n’importe quel nombre d’argument mais une seule expression.

Même sans aucune instruction, la fonction lambda renvoie un objet fonction qui peut être affecté à n’importe quelle autre variable.

Quant aux fonctions régulières, elles sont créées avec le mot clé def. Le nombre d’argument et d’expression de ce dernières peuvent être un, deux, voire plus.

Elles sont utilisées pour n’importe quelle instruction et sont généralement utilisées pour les gros blocs de code.

Pour quelle raison les fonctions lambda sont très utiles ?

On ne voit l’utilité de la fonction lambda que lorsque l’on veut utiliser une fonction qui prend comme argument une autre fonction. Par exemple les fonctions map(), filter() … 

La raison principale pour laquelle les fonctions lambda sont très utiles est que généralement, il est plus pratique d’utiliser une notation lambda simple et concise plutôt que de définir une nouvelle fonction de manière habituelle.

Et surtout, la fonction est créée pour ne faire qu’une seule tâche plutôt que de servir comme composant en boucle.

Un exemple pratique de fonction lambda en Python

Dans cet exemple, nous allons découvrir l’utilisation de la fonction python filter() avec la notation lambda. Mais avant de commencer, nous vous conseillons de lire notre tutoriel sur la programmation Python pour obtenir les bases nécessaires.

La fonction filter() a pour premier argument une fonction et c’est la fonction lambda dans ce cas. Le deuxième argument est la liste à filtrer.

my_list = [1, 2, 3, 4, 5]
list(filter(lambda x: x > 2, my_list))
[3, 4, 5]

IIFE utilisant des fonctions lambda

Les IIFE ou Immediatly Invoked Function Expression sont des fonctions qui sont exécutées dès leur création. Pas besoin d’un appel pour que les IIFE invoquent une fonction. En python, grâce à la fonction lambda on peut créer les IIFE.

Prenons comme exemple une fonction qui renvoie le cube d’un nombre :

(lambda x : x*x*x)(10)

Quelques fonctions lambda en Python

Dans cette partie, nous allons voir quelques fonctions lambda les plus utilisées en Python.

sleep()

La fonction sleep() sert à stopper momentanément un thread (fil de tâche). 

C’est le module time de Python qui fournit toutes les fonctions destinées à la gestion de temps dont le plus utilisé est la fonction sleep().

Voici la syntaxe de base de la fonction sleep() :

time.sleep(nombre)

Ici, ‘nombre’ est la variable qui spécifie le nombre de secondes pendant lesquelles le programme doit être stoppé. 

‘nombre’ est un nombre à virgule flottante, on peut donc avoir un temps de sommeil plus précis. Mais cela n’est pas rassurant, car le temps de mise en sommeil peut être plus court ou plus long que prévu.

import time

print("Imprimé immédiatement.")
time.sleep(2.4)
print("Imprimé après 2.4 secondes.")

Filter()

Vous pouvez créer un nouvel itérateur à partir d’un itérateur existant comme une liste ou un dictionnaire et tout cela grâce à la fonction filter() intégré à Python. 

Un iterable est un objet python qui peut être « itéré ». Cela veut dire qu’il renvoie des éléments dans une séquence utilisable dans une boucle for

Voici la syntaxe de base de la fonction filter() :

filter(function, iterable)

Cette instruction donne en retour un objet filtre qui est un objet itérable. La fonction tel que list() peut être utilisée pour faire une liste de tous les éléments retournés dans un objet filtre.

Utilisation de none avec filter()

Grâce à none, vous pouvez obtenir toutes les valeurs que Python considère comme fausse. Pour Python, tout ce qui a pour longueur 0 est faux. 

Par exemple, considérons une liste vide, une chaîne vide ou encore ce qui est numériquement 0.

aquarium = [11, False, 18, 21, "", 12, 34, 0, [], {}]

Cette liste contient des nombres entiers, des séquences vides et une valeur booléenne.

Appliquons maintenant la fonction filter() à cette expression :

filtre = filter(None, aquarium)

Après cela, la liste filtre est passée dans la fonction list() afin d’obtenir une liste de nos éléments considérés vrai :

print(list(filtre))
[11, 25, 18, 21, 12, 34]

Utilisation de filter() avec une liste de dictionnaire

Face à une structure de donnée plus complexe, vous avez toujours la possibilité d’utiliser la fonction filter() pour l’évaluation de chaque élément.

À titre d’exemple, avec une liste comportant différents détails sur chaque créature se trouvant dans un aquarium.

creatures = [
  {"nom" : "sammy", "espèce" : "requin", "numéro de réservoir" : "11", "type" : "poisson"},
  {"nom" : "ashley", "espèce" : "crabe", "numéro de réservoir" : "25", "type" : "crustacé"},
  {"nom" : "jo", "espèce" : "guppy", "numéro de réservoir" : "18", "type" : "poisson"},
  {"nom" : "jackie", "espèce" : "homard", "numéro de réservoir" : "21", "type" : "crustacé"},
  {"nom" : "charlie", "espèce" : "poisson-clown", "numéro de réservoir" : "12", "type" : "poisson"},
  {"nom" : "olly", "espèce" : "Tortue verte", "Numéro de réservoir" : "34", "type" : "tortue"}
]

Pour filtrer ces données par une suite de recherche, il faut utiliser une fonction imbriquée, puis accéder à chaque dictionnaire et élément des dictionnaires :

def filtre_set(creatures, recherche):
    def iterateur_func(x):
        for v in x.values():
            if recherche_string in v:
                return True
        return False
    return filter(iterateur_func,creatures)

La fonction filtre_set() a pour argument creatures et recherche_string.  Le iterateur_func() se comporte comme la fonction filter() au sein de la fonction filtre_set().  La fonction filtre_set() renvoie l’itérateur résultant defilter().

L’argument x que prend la fonction iterateur_func() représente un élément de la liste.

Ensuite, avec la boucle for, on accède à chaque valeur dans le dictionnaire. Et enfin, on vérifie si la chaîne recherche_string est en v.

map()

La fonction map() intégrée à Python peut être utilisée pour exécuter une fonction à chaque élément d’une liste de données. 

Elle donne comme résultat un objet map utilisable dans la suite du programme. Pour créer un iterable, vous pouvez passer l’objet map a une fonction list() ou autres types de fonction.

Voici la syntaxe de base de la fonction : 

map(function, iterable, [iterable 2, iterable 3, ...])

Cette fonction n’utilise pas la boucle for, mais applique plutôt une fonction à chaque élément de la liste. Cela est plus performant, puisque la fonction ne s’applique que sur un seul élément à la fois au lieu d’avoir une itération de copie d’élément dans un autre.  Elle est donc très utile lorsque le traitement se passe sur des données de grande taille. 

Elle a la capacité de prendre plusieurs iterables comme argument de la fonction et à la sortie, elle renvoie un élément et un seul élément de chaque iterable.

reduce()

Avec la fonction reduce(), vous pouvez passer en argument une fonction particulière et pouvoir l’utiliser sur tous les éléments de la liste. C’est dans le module functools que se trouve la fonction reduce().

Voici la syntaxe de base de la fonction : 

reduce(function, sequence[, initial]) -> value

Fonction reduce() avec 3 arguments

Avec Python3, la fonction peut prendre trois paramètres ainsi que deux paramètres. 

Dans l’exécution du code, si le deuxième argument existe, reduce() place d’abord la valeur du troisième argument avant la valeur du second argument. 

Le troisième argument sert par défaut si le deuxième argument est une séquence vide.

L’objet série

Une colonne dans une table de données est un objet série. En d’autres termes, une séquence de valeurs ayant chacune des indices correspondants.

Les valeurs de trame de donnée Pandas peuvent être manipulées grâce à la fonction lambda.

Utilisation de fonction lambda Python avec différente autre fonction

Ici, nous allons prendre un cas précis. Grâce au dataframe ci-dessous, on va pouvoir appliquer les fonctions lambda avec d’autres fonctions de dataframe en Python. 

Dans ce dataframe, on a un ensemble de données donnant quelques informations sur une famille de 5 personnes, chacun avec son identifiant, son âge, son nom et son revenu mensuel.

import pandas as pd

df=pd.DataFrame({ 
    'id' :[1,2,3,4,5], 
    ' nom' :['Jeremy', 'Frank', 'Janet', 'Ryan', 'Mary'], 
    ' âge' : [20,25,15,10,30], 
    'revenu':[4000,7000,200,0,10000] 
})

Df

Une fois exécutée, voici le résultat obtenu :

Maintenant, voyons quelques fonctions sur lesquelles on va pouvoir appliquer les fonctions lambda sur ce data frame.

L’utilisation de lambda python avec apply() de pandas

Grâce à la fonction apply(), vous pouvez effectuer une opération sur chaque élément de la colonne du tableau. 

Par exemple, s’il y a une erreur au niveau de la variable âge. Supposons que les âges doivent être enregistrés avec une différence de 2 ans.

Ainsi pour corriger cette erreur de la base de données, il faut rajouter 2 ans à l’âge de chaque personne. Cela est possible grâce à la fonction apply() dans Pandas.

La fonction apply() appelle la fonction lambda et elle se charge d’ajouter 2 ans de plus à toutes les lignes du variable âge, comme ceci :

df['âge']=df.apply(lambda x : x['âge']+2,axis=1)

Le résultat sera donc :

Vous pouvez utiliser la fonction apply() pour appliquer la fonction lambda sur les lignes si l’argument d’axe dans la fonction apply() est 1 et 0 lorsqu’elle s’applique sur les colonnes.

La fonction apply() peut également être appliquée directement sur une série de données Pandas. On obtient le même résultat avec le code suivant : 

df['âge']=df['âge'].apply(lambda x : x+3)

Utilisation de lambda avec la fonction filtre() de Python

Cette fonction prend deux arguments : le premier est la fonction lambda et le deuxième argument est une expression de condition. Cela donne à la fin une liste de valeurs qui satisfait la condition :

list(filter(lambda x : x>18,df['âge']))

Utilisation de lambda avec la fonction map() de Python

Cette fonction est similaire à la fonction apply() car elle peut aussi modifier les valeurs d’une colonne en fonction d’une expression. 

df['double_âge'] = df['âge'].map(lambda x : x*2)

Utilisation de lambda avec la fonction reduce() de Python

Pour connaître le revenu total de la famille, par exemple, il faut utiliser la fonctionreduce() en Python. 

Avec reduce(), on utilise une fonction particulière pour effectuer une opération sur la liste des éléments : 

import functools 
functools.reduce(lambda a,b: a+b,df['revenu'])
21200

Le résultat obtenu est l’application de la fonction lambda() par reduce() sur les deux premiers éléments de la série. Ensuite, il sauvegarde le résultat et effectue la même opération en utilisant la fonction lambda() sur l’élément suivant et ainsi de suite.

Remarque : Lorsque lambda() est utilisé avec la fonction reduce(), elle peut prendre plus de deux arguments.

Fonction lambda : Instruction conditionnelle

Les conditions if et else sont également pris en charge par les fonctions lambda() et cela les rend encore plus puissantes.

Par exemple, en voulant catégoriser les personne adultes ou enfants dans la base de donnée familiale, il faut tout simplement appliquer la fonction lambda() au data frame. 

Vous pouvez aussi obtenir un résultat sur la base de certaines conditions et critères. Le code ci-dessous renvoie “Homme” si la valeur nom est vérifié par Feminin ou Masculin et donne femme dans le cas contraire :

df['Genre'] = df['nom'].map(lambda x: 'Feminin' if x=='Mary' or x=='Janet' else 'Masculin')

Cas d’utilisation déconseillé de la fonction lambda

Il faut savoir que certaines utilisations sont proscrites lorsque l’on souhaite utiliser les fonctions lambda. Nous allons vous les énumérer et apporter des explications sur ce sujet.

Donner un nom à une fonction lambda

Cette pratique est fortement déconseillée dans le guide de style python PEP8, parce que lambda génère une fonction anonyme qui ne sera pas stockée. 

Par contre, l’utilisation d’une fonction normale def pour la sauvegarde la fonction lambda est conseillée.

#Mauvais 
double = lambda x : x*2

#Bon 
def double(x) : 
     return x*2 

Passer des fonctions à l’intérieur de la fonction lambda

L’utilisation des fonctions qui ne prennent qu’un seul argument numérique avec lambda est déconseillée, par exemple la fonction abs, car la fonction peut être directement introduite la fonction map() ou apply().

#Mauvaise
map(lambda x:abs(x), list_3)

#Bonne
map(abs, liste_3)

#Bonne
map(lambda x : pow(x, 2), float_nums)

Les avantages et inconvénients des fonctions lambda

En soi, la fonction lambda présente des avantages et des inconvénients. Comme avantages, nous pouvons citer le fait que :

  • Elles sont très efficaces pour les opérations logiques simples
  • Les fonctions lambda sont adéquates si vous voulez utiliser une fonction une et une seule fois

En ce qui concerne les inconvénients, nous pouvons émettre des remarques sur le fait que :

  • Les fonctions lambda n’exécutent qu’une seule expression. Il est impossible d’avoir plusieurs opérations indépendantes en son sein.
  •  C’est aussi impossible de pouvoir donner une explication sur toutes les entrées, opération et sortie avec une chaîne de documentation comme cela se fait avec la fonction normale def.

Les fonctions du module math()

De base, on trouve assez de fonctions math dans de nombreuses applications. Pour obtenir les données linéaires par exemple, on utilise les logarithmes pour mettre à l’échelle ces données qui évoluent de manière exponentielle. 

Les fonctions courantes quand on travaille avec des informations géométriques sont : fonction exponentielle et trigonométrique.

En combinatoire, on trouve généralement la fonction gamma et en statistique, c’est la fonction d’erreur gaussienne.

Le module math de la bibliothèque standard de Python fournit toutes les fonctions mathématiques, ainsi que les constantes communes et certaines fonctions d’utilité.

Les fonctions arithmétiques du module math

Fonction ceil

 math.ceil(x) : avec cette fonction, on obtient la partie entière supérieure à x, le plus petit nombre entier supérieur ou égal à x.

Fonction copysign

math.copysign(x,y) : avec cette fonction, on obtient un float ayant la valeur absolue de x mais avec le signe du paramètre y.

Fonction fabs

math.fabs(x) : elle retourne la valeur absolue de x.

Fonction factorial

math.factorial(x) : avec cette fonction, on obtient la factorielle de x. Elle retourne une valeur Erreur si x n’est pas un entier ou s’il est négatif.

Fonction floor

math.floor(x) : avec cette fonction, on obtient le minimum de x, le plus grand entier inférieur ou égal à x. Si x n’est pas un float, il retourne x.

Fonction gcd

math.gcd(x,y) : avec cette fonction, on obtient le plus grand diviseur commun des entiers x et y, si x ou y n’est pas nul. Aussi, gcd(0,0) retourne 0.

Fonction modf

math.modf(x) : avec cette fonction, on obtient la partie entière et la partie fractionnaire de x. Les deux valeurs sont de mêmes signes que x et sont des entiers décimaux.

Fonction fmod

math.fmod(x,y) :  avec cette fonction, on obtient le modulo de x par y. 

Retenez que l’expression x % y en Python peut ne pas retourner le même résultat que la fonction fmod()

La signification du standard C pour fmod(x, y) est d’être précisément égal à x – n*y pour un entier n tel que le résultat a le signe de x et une valeur plus petite que abs(y).

Voici leurs syntaxes : 

import math
math.ceil(-4.3)
math.copysign(2,-0.1)
math.fabs(-23)
math.factorial(3)
math.floor(2.23)
math.gcd(20,4)
math.modf(4.21)
math.fmod(20,7)

Et voici les résultats obtenus à l’issus de cela :

Les Fonctions trigonométriques du module math

Fonction acos

math.acos(x) : elle retourne l’arc cosinus de x, en radians.

Fonction asin

math.asin(x): elle retourne l’arc sinus de x, en radians.

Fonction atang

math.atang(x) : elle retourne l’arc tangent de x, en radians.

Fonction cos

math.cos(x) : elle retourne le cosinus de x, en radians.

Fonction sin

math.sin(x) : elle retourne le sinus de x, en radians.

Fonction tan

math.tan(x) : elle retourne le tangent de x, en radians.

Fonction atan2

math.atan2 (x,y) : elle retourne l’arc tangent de x par y , en radians (atan(x/y).

Attention : on ne peut pas effectuer des opérations avec des nombres complexes avec ces différentes fonctions. Pour les nombres complexes, il faut plutôt le module cmath.

import math
math.acos(0.5)
math.asin(0.5)
math.atan(0.5)
math.sin(45)
math.cos(45)
math.tan(45)
math.atan2(90,2)

Les Fonctions hyperboliques du module math 

Fonction acosh

math.acosh(x) : renvoie l’arc cosinus hyperbolique  de x.

Fonction asinh

math.asinh(x): renvoie l’arc sinus hyperbolique  de x.

Fonction cosh

math.cosh(x) : renvoie le cosinus  hyperbolique de x.

Fonction sinh

math.sinh(x) : renvoie le sinus hyperbolique de x.

Fonction tanh

math.tanh(x) : renvoie le tangent hyperbolique  de x.

Fonction atangh

math.atangh(x) : renvoie l’arc tangent hyperbolique  de x.

import math
math.acosh(45)
math.asinh(45)
math.atanh(0.1)
math.sinh(45)
math.cosh(45)
math.tanh(45)

Autre fonction importante du module math

Le module math de python comporte, en plus de la fonction standard, un certain nombre de fonctions théoriques et de fonctions combinatoires. 

C’est des fonctions combinatoires et factorielles très utiles dans une variété d’applications. 

Avec la fonction comb(), on obtient le nombre de fois qu’il est possible de faire un choix de K article dans une collection de n sans faire une répétition dans le cas où l’ordre n’est pas important.

Comme exemple, prélever 1 et ensuite 2 est la même chose que prélever 2 puis 1. On le note parfois nCk.

Les constantes en python 

Fonction inf

math.inf : un float infini positif. Pour -infini, on utilise -math.inf

Fonction pi

math.pi: donne La constante Pi = 3.141592…, à la précision disponible.

Fonction e

math.e: donne da constante e = 2.718281…, à la précision disponible.

Autres fonctions lambda en python 

Fonction erf

math.erf(x) : donne la fonction d’erreur en x.

Fonction erfc

math.erfc(x) : renvoie la fonction d’erreur supplémentaire en x.

Fonction gamma

math.gamma(x) : renvoie la fonction Gamma en x.

Fonction lgamma

math.lgamma(x): renvoie le logarithme normal de abs(math.gamma(x)).

import math
math.erf(23)
math.erfc(4)
math.gamma(45)
math.lgamma(34)

Voilà, nous arrivons à terme de ce tutoriel sur les fonctions lambda en Python. Avec les points évoqués dans cet article ainsi que les multiples exemples que vous avons présentés, vous avez toutes les bases requises pour pouvoir utiliser ces fonctions dans vos projets Big Data ou tout autre projet en Python.

Si vous souhaitez approfondir vos connaissances dans le Big Data, nous vous invitons de télécharger ce tutoriel sur la programmation Scala pour le Big Data.


Juvénal JVC

Juvénal est spécialisé depuis 2011 dans la valorisation à large échelle des données. Son but est d'aider les professionnels de la data à développer les compétences indispensables pour réussir dans le Big Data. Il travaille actuellement comme Lead Data Engineer auprès des grands comptes. Lorsqu'il n'est pas en voyage, Juvénal rédige des livres ou est en train de préparer la sortie d'un de  ses livres. Vous pouvez télécharger un extrait de son dernier livre en date ici : https://www.data-transitionnumerique.com/extrait-ecosystme-hadoop/

  • Allain dit :

    La fonction filtre() n’existe pas

  • >