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 liste l en paramètre et qui retourne la liste composée des carrés des éléments de la liste l.

  • Evaluez la fonction sur la liste des entiers de 1 à 10.

Hide 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]
Hide 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

  1. Créez la fonction \(x\mapsto x+1\) appelée right_shift

  2. Créez la fonction \(f\mapsto fof\) appelée compose. Cette fonction prend donc en paramètre une fonction et retourne une fonction…

  3. Evaluez compose(right_shift)(0) qui devrait vous retourner 2 !

Hide 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