Je viens de commencer Python et je me suis retrouvé nez à nez avec Lambda, ce qui m'a pris un certain temps à comprendre. Lambda fait-il partie de ces éléments de langage "intéressants" qu'il faut oublier dans la vie réelle ? Je suis sûr qu'il y a des cas limites où il peut être nécessaire, mais étant donné son obscurité, la possibilité qu'il soit redéfini dans les prochaines versions (mon hypothèse basée sur les diverses définitions de celui-ci) et la clarté réduite du codage - devrait-on l'éviter ? Cela me rappelle le débordement (buffer overflow) des types C - pointer vers la variable supérieure et surcharger pour définir les valeurs des autres champs... une sorte de spectacle technique mais un cauchemar pour les codeurs de maintenance...
Réponses
Trop de publicités?Parlez-vous des fonctions lambda ? Comme
f = lambda x: x**2 + 2*x - 5
Ces choses sont en fait assez utiles. Python supporte un style de programmation appelé programmation fonctionnelle où vous pouvez passer des fonctions à d'autres fonctions pour faire des choses. Exemple :
mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])
fixe mult3
à [3, 6, 9]
les éléments de la liste originale qui sont des multiples de 3, ce qui est plus court (et, pourrait-on dire, plus clair) que
def filterfunc(x):
return x % 3 == 0
mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])
Bien sûr, dans ce cas particulier, vous pourriez faire la même chose avec une compréhension de liste :
mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]
(ou même comme range(3,10,3)
) mais il y a d'autres cas, comme la construction de fonctions en tant que valeurs de retour d'autres fonctions, où vous ne pouvez pas utiliser une liste de compréhension et où une fonction lambda peut être le moyen le plus court d'écrire quelque chose. Comme
def transform(n):
return lambda x: x + n
f = transform(3)
f(4) # is 7
J'utilise régulièrement les fonctions lambda. Il m'a fallu un certain temps pour m'y habituer, mais une fois que je l'ai fait, je suis content que Python en dispose ;-)
lambda
est juste une façon élégante de dire function
. En dehors de son nom, il n'a rien d'obscur, d'intimidant ou de cryptique. Lorsque vous lisez la ligne suivante, remplacez lambda
par function
dans votre esprit :
>>> f = lambda x: x + 1
>>> f(3)
4
Il définit simplement une fonction de x
. D'autres langues, comme R
dites-le explicitement :
> f = function(x) { x + 1 }
> f(3)
4
Vous voyez ? C'est l'une des choses les plus naturelles à faire en programmation.
Le résumé en deux lignes :
- Fermetures : Très utile. Apprenez-les, utilisez-les, aimez-les.
- Python
lambda
Mot clé : inutile, occasionnellement utile. Si vous vous retrouvez à faire quoi que ce soit d'un peu complexe avec elle, rangez-la et définissez une vraie fonction.
Un lambda fait partie d'un mécanisme d'abstraction très important qui traite des fonctions d'ordre supérieur. Pour bien comprendre sa valeur, veuillez regarder les leçons de haute qualité de Abelson et Sussman et lire le livre SICP
Il s'agit là de questions pertinentes dans le secteur moderne des logiciels, et qui deviennent de plus en plus populaires.
Je doute que Lambda disparaisse. Voir Le message de Guido pour finalement abandonner l'idée de l'enlever. Voir aussi un aperçu du conflit .
Vous pouvez consulter cet article pour en savoir plus sur l'historique des fonctionnalités de Python : http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html
Curieusement, les fonctions map, filter et reduce qui ont motivé à l'origine l'introduction de lambda et d'autres fonctionnalités ont été, dans une large mesure, supplantées par les compréhensions de listes et les expressions génératrices. En fait, la fonction reduce a été retirée de la liste des fonctions intégrées dans Python 3.0. (Cependant, il n'est pas nécessaire de se plaindre de la suppression de lambda, map ou filter : ils restent :-)
Mes deux centimes : Il est rare que lambda en vaille la peine en termes de clarté. Il existe généralement une solution plus claire qui n'inclut pas lambda.