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 :
lambda parametri: espressioneÉquivalent à def, mais plus concis et adapté aux fonctions "jetables" à
passer à d'autres fonctions.
quadrato = lambda x: x ** 2
quadrato(5) # 25
# equivalent to:
def quadrato(x):
return x ** 2Différences vs def
| Aspect | def | lambda |
|---|---|---|
| nom | obligatoire | anonyme |
| corps | plusieurs énoncés | une SEULE expression |
| retour | explicite | implicite (l'expression) |
| docstring | oui | non |
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.
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 :
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 ageAutres utilisations typiques : min(...), max(...), filter(...), map(...).
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
Étant donné la liste `words = ['banana', 'kiwi', 'mela', 'fragola']`, triez-la par longueur croissante dans `by_length`. Évaluez `by_length`.
Afficher l'indice
key=len (ou lambda p: len(p)).
Solution disponible après 3 tentatives
Exercice de révision
É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`.
Afficher l'indice
lambda p: p[1]
Solution disponible après 3 tentatives
Défi supplémentaire
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.
Afficher l'indice
Écrivez is_even = lambda x: x % 2 == 0 puis appelez is_even(8).
Solution disponible après 3 tentatives