3.2. Les lambda
-fonctions#
Nous commençons par détailler la structure des lambda
-fonctions.
Un exemple sera plus parlant. Construisons la fonction \(x\mapsto x^2\).
carre = lambda x: x**2
x = 2.1
print(f"Evaluation de la fonction carre sur x={x} : {carre(x)}")
Evaluation de la fonction carre sur x=2.1 : 4.41
Il est possible d’avoir plusieurs variables et plusieurs sorties :
echange = lambda x, y: (y, x)
x, y = 1, 2
print(f"On échange {x} et {y} : {echange(x, y)}")
On échange 1 et 2 : (2, 1)
On peut faire des choses plus compliquées avec l’opérateur ternaire :
inverse = lambda x: 1./x if x != 0 else None
x, y = 2, 0
print(f"1/{x} = {inverse(x)}")
print(f"1/{y} = {inverse(y)}")
1/2 = 0.5
1/0 = None
Exercice
Créez une
lambda
-fonction qui prend une listel
en paramètre et qui retourne la liste composée des carrés des éléments de la listel
.Evaluez la fonction sur la liste des entiers de 1 à 10.
Show code cell source
liste_carres = lambda l: [lk*lk for lk in l] # en utilisant la compréhension de liste
print(liste_carres([k for k in range(1, 11)]))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Show code cell source
liste_carres = lambda l: list(map(lambda x: x*x, l)) # en utilisant map
print(liste_carres([k for k in range(1, 11)]))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Il est même possible de faire des fonctions récurisves grâce à l’opérateur ternaire.
factorielle = lambda n: n*factorielle(n-1) if n > 1 else 1
print(factorielle(3))
print(factorielle(20))
6
2432902008176640000
Exercice
Créez la fonction \(x\mapsto x+1\) appelée
right_shift
Créez la fonction \(f\mapsto fof\) appelée
compose
. Cette fonction prend donc en paramètre une fonction et retourne une fonction…Evaluez
compose(right_shift)(0)
qui devrait vous retourner2
!
Show code cell source
right_shift = lambda x: x+1
compose = lambda f: lambda x: f(f(x))
print(compose(right_shift)(0))
2
Attention
Les lambda
-fonctions n’ont ni nom, ni documentation. Elles sont utilisées dans le corps d’un code comme un raccourci pour une expression.
f = lambda x: 2*x
help(f)
f.__name__ = "ma fonction"
f.__doc__ = """
On peut tout de même ajouter de la documentation mais c'est tricher avec la notion d'objet...
fonction x -> 2*x
"""
help(f)
Help on function <lambda> in module __main__:
<lambda> lambda x
Help on function ma fonction in module __main__:
ma fonction(x)
On peut tout de même ajouter de la documentation mais c'est tricher avec la notion d'objet...
fonction x -> 2*x