Passer au contenu principal
eLearner.app
Module 5 · Leçon 4 sur 420/36 dans le cours~10 min
Leçons du module (4/4)

Lambda et fonctions d'ordre supérieur

Une lambda est une fonction anonyme, définie sur une seule ligne. Syntaxe :

Python
lambda parametri: espressione

Équivalent à def, mais plus concis et adapté aux fonctions "jetables" à passer à d'autres fonctions.

Python
quadrato = lambda x: x ** 2
quadrato(5)    # 25

# equivalent to:
def quadrato(x):
    return x ** 2

Différences vs def

Aspectdeflambda
nomobligatoireanonyme
corpsplusieurs énoncésune SEULE expression
retourexpliciteimplicite (l'expression)
docstringouinon

Pas de return dans une lambda : la valeur de l'expression EST le résultat.

Quand utiliser lambda

Presque toujours : comme argument key pour les fonctions de tri ou de sélection.

Python
parole = ["banana", "kiwi", "mela", "fragola"]
sorted(parole, key=len)
# ['kiwi', 'mela', 'banana', 'fragola']

key=len indique à sorted : "pour comparer deux éléments, utilisez leur longueur". Pour des critères personnalisés, utilisez lambda :

Python
utenti = [
    {"nome": "Ada", "eta": 36},
    {"nome": "Linus", "eta": 54},
    {"nome": "Grace", "eta": 85},
]
per_eta = sorted(utenti, key=lambda u: u["eta"])
# sorted by ascending age

Autres utilisations typiques : min(...), max(...), filter(...), map(...).

Python
nums = [-3, 1, -4, 1, -5, 9]
max(nums, key=lambda n: abs(n))   # -5 (maximum by absolute value)

Fonctions d'ordre supérieur

Une fonction est d'ordre supérieur si elle accepte une fonction comme argument ou en renvoie une. sorted, max, filter, map sont d'ordre supérieur. Lambda existe précisément pour faciliter les appels d'ordre supérieur.

Quand éviter les fonctions lambda

Les fonctions lambda sont utiles pour les opérations courtes et ponctuelles (comme le tri rapide). Cependant, si vous vous retrouvez à assigner une lambda à une variable (par exemple double = lambda x: x * 2), il est généralement préférable d'utiliser un bloc def standard pour des raisons de lisibilité et de débogage (car les fonctions définies avec def conservent leurs vrais noms dans les traces d'erreur).

À vous de jouer

Exercice#python.m5.l4.e1
Tentatives : 0Chargement…

Étant donné la liste `words = ['banana', 'kiwi', 'mela', 'fragola']`, triez-la par longueur croissante dans `by_length`. Évaluez `by_length`.

Chargement de l'éditeur…
Afficher l'indice

key=len (ou lambda p: len(p)).

Solution disponible après 3 tentatives

Exercice de révision

Exercice#python.m5.l4.e2
Tentatives : 0Chargement…

Étant donné la liste de tuples `points = [(1, 5), (3, 2), (2, 4)]`, triez-les par le DEUXIÈME élément par ordre croissant et attribuez le résultat à `by_y`. Évaluez `by_y`.

Chargement de l'éditeur…
Afficher l'indice

lambda p: p[1]

Solution disponible après 3 tentatives

Défi supplémentaire

Exercice#python.m5.l4.e3
Tentatives : 0Chargement…

Définissez une fonction `lambda` anonyme qui prend un nombre `x` et renvoie `True` si le nombre est pair, et `False` sinon. Assignez la lambda à la variable `is_even` et testez-la avec `is_even(8)` comme dernière ligne.

Chargement de l'éditeur…
Afficher l'indice

Écrivez is_even = lambda x: x % 2 == 0 puis appelez is_even(8).

Solution disponible après 3 tentatives