J'essaie de comprendre les lambdas Python. Lambda fait-il partie de ces éléments de langage "intéressants" qui, dans la vraie vie, devraient être oubliés?
Je suis sûr qu'il y a des cas marginaux où cela pourrait être nécessaire, mais étant donné son obscurité, son potentiel d'être redéfini dans les versions futures (mon hypothèse basée sur les différentes définitions de celui-ci) et la clarté de codage réduite - si cela devait être évité?
Cela me rappelle le débordement (débordement de tampon) des types C - pointant vers la variable supérieure et surchargeant pour définir les autres valeurs de champ. Cela ressemble à une sorte de mise en scène technique, mais au cauchemar du codeur de maintenance.
Réponses:
Parlez-vous des fonctions lambda ? Comme
Ces choses sont en fait très utiles. Python prend en charge un style de programmation appelé programmation fonctionnelle où vous pouvez passer des fonctions à d'autres fonctions pour faire des choses. Exemple:
définit
mult3
à[3, 6, 9]
, les éléments de la liste d'origine qui sont des multiples de 3. Ceci est plus court (et, pourrait-on dire, plus clair) queBien sûr, dans ce cas particulier, vous pouvez faire la même chose qu'une compréhension de liste:
(ou même comme
range(3,10,3)
), mais il existe de nombreux autres cas d'utilisation plus sophistiqués où vous ne pouvez pas utiliser une compréhension de liste et une fonction lambda peut être le moyen le plus court d'écrire quelque chose.Retourner une fonction d'une autre fonction
Ceci est souvent utilisé pour créer des wrappers de fonction, tels que les décorateurs de Python.
Combinaison d'éléments d'une séquence itérable avec
reduce()
Tri par une clé alternative
J'utilise régulièrement des fonctions lambda. Il m'a fallu un certain temps pour m'y habituer, mais j'ai fini par comprendre qu'ils sont une partie très précieuse de la langue.
la source
','.join(str(x) for x in [1,2,3,4,5,6,7,8,9])
lambda
fonctions peuvent être anonymes (comme elles le sont dans tous vos exemples). Si vous attribuez unelambda
fonction à quelque chose, vous le faites mal etdef
lambda
est juste une façon élégante de direfunction
. À part son nom, il n'a rien d'obscur, d'intimidant ou de cryptique. Lorsque vous lisez la ligne suivante, remplacezlambda
parfunction
dans votre esprit:Il définit simplement une fonction de
x
. Certaines autres langues, commeR
, le disent explicitement:Tu vois? C'est l'une des choses les plus naturelles à faire en programmation.
la source
lambda
très simple à comprendre. Merci!lambda
parfunction
dans votre esprit et ajouterreturn
avant la dernière expressiontype(lambda x: 3)
.lambda
les expressions et lesdef
instructions génèrent toutes deux desfunction
objets; il est seulement la syntaxe d'unelambda
expression que les limites qui les instances qu'elle peut produire.lambda
expression que le résultat d'unelambda
expression n'est pas une fonction.Le résumé en deux lignes:
lambda
Mot - clé de Python : inutile, parfois utile. Si vous vous retrouvez à faire quelque chose de complexe à distance avec lui, rangez-le et définissez une fonction réelle.la source
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é d' Abelson et Sussman et lire le livre SICP
Ce sont des questions pertinentes dans le secteur des logiciels modernes et qui deviennent de plus en plus populaires.
la source
lambda
s et les fonctions de première classe. Python a unelambda
instruction extrêmement limitée , mais des fonctions entièrement de première classe. La seule différence que cela fait est que vous devez nommer les fonctions que vous souhaitez faire circuler.les lambdas sont extrêmement utiles dans la programmation graphique. Par exemple, supposons que vous créez un groupe de boutons et que vous souhaitez utiliser un rappel unique paramétré plutôt qu'un rappel unique par bouton. Lambda vous permet d'accomplir cela facilement:
(Remarque: bien que cette question porte spécifiquement sur
lambda
, vous pouvez également utiliser functools.partial pour obtenir le même type de résultat)L'alternative consiste à créer un rappel distinct pour chaque bouton, ce qui peut entraîner un code dupliqué.
la source
value
est défini dans une boucle; dans l'autre exemple, le paramètre n'avait toujours qu'une seule valeur. Lorsque vous ajoutez quelque chose commearg=value
, vous attachez la valeur actuelle au rappel. Sans elle, vous liez une référence à la variable dans le rappel. La référence contiendra toujours la valeur finale de la variable, car le rappel se produit quelque temps après que la boucle a déjà terminé son exécution.functools.partial()
qui vous permet de le faire avec moins de cruches (et sanslambda
).partial(my_callback, value)
vslambda arg=value: my_callback(arg)
- le lambda a beaucoup plus de cruauté (affectation à arg et ensuite utilisation) et il est moins clair quelle est l'intention (vous pourriez faire quelque chose de subtilement différent dans le lambda). Les importations ne sont pas vraiment un problème (vous avez quand même une pile et c'est une fois par fichier). Le code est mieux jugé sur la qualité de sa lecture etpartial()
est beaucoup plus facile à lire que le lambda.Je doute que lambda s'en ira. Voir le post de Guido sur l'abandon final de la tentative de suppression. Voir également un aperçu du conflit .
Vous pouvez consulter ce post pour plus d'historique sur l'accord derrière les fonctionnalités de Python: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html
Mes propres deux cents: Rarement lambda en vaut la peine en ce qui concerne la clarté. Il existe généralement une solution plus claire qui n'inclut pas lambda.
la source
En Python,
lambda
est juste un moyen de définir des fonctions en ligne,et..
..sont exactement les mêmes.
Il n'y a rien que vous puissiez faire avec lambda que vous ne pouvez pas faire avec une fonction régulière - en Python, les fonctions sont un objet comme tout le reste, et lambdas définit simplement une fonction:
Je pense honnêtement que le
lambda
mot-clé est redondant en Python - je n'ai jamais eu besoin de les utiliser (ou vu une utilisée là où une fonction régulière, une compréhension de liste ou l'une des nombreuses fonctions intégrées aurait pu être mieux utilisée à la place)Pour un exemple complètement aléatoire, extrait de l'article "Le lambda de Python est cassé!" :
Je dirais que même si cela a fonctionné, c'est horriblement et "impythonique", la même fonctionnalité pourrait être écrite de nombreuses autres façons, par exemple:
Oui, ce n'est pas la même chose, mais je n'ai jamais vu de cause où la génération d'un groupe de fonctions lambda dans une liste a été requise. Cela pourrait avoir du sens dans d'autres langages, mais Python n'est pas Haskell (ou Lisp, ou ...)
Éditer:
Il y a quelques cas où lambda est utile, par exemple, il est souvent pratique lors de la connexion de signaux dans des applications PyQt, comme ceci:
Le simple fait d'
w.textChanged.connect(dothing)
appeler ladothing
méthode avec unevent
argument supplémentaire et de provoquer une erreur. L'utilisation du lambda signifie que nous pouvons supprimer proprement l'argument sans avoir à définir une fonction de wrapping.la source
a
que vous avez définis ne sont pas exactement les mêmes. :) Ils diffèrent__name__
au moins par domaine ...Je trouve lambda utile pour une liste de fonctions qui font de même, mais pour des circonstances différentes.
Comme les règles plurielles de Mozilla :
Si vous deviez définir une fonction pour tous ceux que vous deviendriez fous à la fin de celui-ci.
En outre, il ne serait pas bien avec les noms de fonctions comme
plural_rule_1
,plural_rule_2
, etc. Et vous devezeval()
quand vous êtes en fonction d'un identifiant de fonction variable.la source
À peu près tout ce que vous pouvez faire avec
lambda
vous pouvez faire mieux avec les fonctions nommées ou les expressions de liste et de générateur.Par conséquent, pour la plupart, vous ne devriez en utiliser qu'une dans pratiquement toutes les situations (sauf peut-être pour le code de travail écrit dans l'interpréteur interactif).
la source
J'utilise Python depuis quelques années et je n'ai jamais rencontré de cas où j'avais besoin de lambda. Vraiment, comme le dit le tutoriel , c'est juste pour le sucre syntaxique.
la source
Je ne peux pas parler de l'implémentation particulière de lambda par python, mais en général les fonctions lambda sont vraiment pratiques. Ils sont une technique de base (peut-être même LA technique) de la programmation fonctionnelle, et ils sont également très utiles dans les programmes orientés objet. Pour certains types de problèmes, ils sont la meilleure solution, il ne faut donc pas les oublier!
Je vous suggère de lire les fermetures et la fonction de carte (qui relie aux documents python, mais elle existe dans presque tous les langages qui prennent en charge les constructions fonctionnelles) pour voir pourquoi elle est utile.
la source
La fonction lambda est un moyen non bureaucratique de créer une fonction.
C'est ça. Par exemple, supposons que vous ayez votre fonction principale et que vous ayez besoin de mettre les valeurs au carré. Voyons la manière traditionnelle et la manière lambda de le faire:
Manière traditionnelle:
La façon lambda:
Regarde la différence?
Les fonctions lambda vont très bien avec les listes, comme les compréhensions de listes ou les cartes. En fait, la compréhension des listes est une façon "pythonique" de vous exprimer en utilisant lambda. Ex:
Voyons ce que signifie chaque élément de la syntaxe:
C'est pratique euh? Créer des fonctions comme celle-ci. Réécrivons-le en utilisant lambda:
Maintenant, utilisons map, qui est la même chose, mais plus neutre en termes de langue. Maps prend 2 arguments:
(i) une fonction
(ii) un itérable
Et vous donne une liste où chaque élément est la fonction appliquée à chaque élément de l'itérable.
Donc, en utilisant la carte, nous aurions:
Si vous maîtrisez les lambdas et la cartographie, vous aurez un grand pouvoir pour manipuler les données et de manière concise. Les fonctions lambda ne sont ni obscures ni nettes de la clarté du code. Ne confondez pas quelque chose de dur avec quelque chose de nouveau. Une fois que vous commencez à les utiliser, vous le trouverez très clair.
la source
À
lambda
mon avis, une des bonnes choses sous-estimées est que c'est une façon de reporter une évaluation pour des formulaires simples jusqu'à ce que la valeur soit nécessaire. Laisse-moi expliquer.De nombreuses routines de bibliothèque sont implémentées afin de permettre à certains paramètres d'être callables (dont lambda est un). L'idée est que la valeur réelle sera calculée uniquement au moment où elle va être utilisée (plutôt que lorsqu'elle est appelée). Un exemple (artificiel) pourrait aider à illustrer ce point. Supposons que vous ayez une routine qui allait enregistrer un horodatage donné. Vous voulez que la routine utilise l'heure actuelle moins 30 minutes. Tu appellerais ça comme ça
Supposons maintenant que la fonction réelle ne sera appelée que lorsqu'un certain événement se produit et que vous souhaitez que l'horodatage soit calculé uniquement à ce moment. Vous pouvez faire ça comme ça
En supposant que le
log_timestamp
peut gérer les callables comme celui-ci, il évaluera cela quand il en aura besoin et vous obtiendrez l'horodatage à ce moment-là.Il y a bien sûr d'autres façons de le faire (en utilisant le
operator
module par exemple) mais j'espère avoir bien fait comprendre ce point.Mise à jour : Voici un exemple un peu plus concret du monde réel.
Mise à jour 2 : Je pense que c'est un exemple de ce qu'on appelle un thunk .
la source
Comme indiqué ci-dessus, l'opérateur lambda en Python définit une fonction anonyme, et dans les fonctions Python sont des fermetures. Il est important de ne pas confondre le concept de fermeture avec l'opérateur lambda, qui n'est pour eux que de la méthadone syntaxique.
Quand j'ai commencé en Python il y a quelques années, j'utilisais beaucoup les lambdas, pensant qu'ils étaient cool, ainsi que des listes de compréhension. Cependant, j'ai écrit et dois maintenir un gros site web écrit en Python, avec de l'ordre de plusieurs milliers de points de fonction. J'ai appris par expérience que les lambdas pourraient être corrects pour prototyper des choses, mais n'offrent rien sur les fonctions en ligne (fermetures nommées), sauf pour enregistrer quelques touches, ou parfois non.
Fondamentalement, cela se résume à plusieurs points:
C'est une raison suffisante pour les rassembler et les convertir en fermetures nommées. Cependant, je garde deux autres rancunes contre les fermetures anonymes.
La première rancune est simplement qu'ils ne sont qu'un autre mot clé inutile encombrant la langue.
La deuxième rancune est plus profonde et au niveau du paradigme, c'est-à-dire que je n'aime pas qu'ils promeuvent un style de programmation fonctionnelle, car ce style est moins flexible que le style de passage de message, orienté objet ou procédural, parce que le calcul lambda n'est pas Turing- complet (heureusement en Python, nous pouvons encore sortir de cette restriction même à l'intérieur d'un lambda). Les raisons pour lesquelles je pense que les lambdas font la promotion de ce style sont:
Il y a un retour implicite, c'est-à-dire qu'ils semblent "devoir" être des fonctions.
Ils sont un mécanisme alternatif de masquage d'état à un autre mécanisme, plus explicite, plus lisible, plus réutilisable et plus général: les méthodes.
Je m'efforce d'écrire du Python sans lambda et de supprimer les lambdas à vue. Je pense que Python serait un langage légèrement meilleur sans lambdas, mais c'est juste mon opinion.
la source
Y = lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))
Les lambdas sont en fait des constructions très puissantes qui découlent des idées de programmation fonctionnelle, et c'est quelque chose qui ne sera en aucun cas facilement révisé, redéfini ou supprimé dans un proche avenir de Python. Ils vous aident à écrire du code plus puissant car il vous permet de passer des fonctions comme paramètres, d'où l'idée de fonctions en tant que citoyens de première classe.
Les lambdas ont tendance à être déroutants, mais une fois qu'une bonne compréhension est obtenue, vous pouvez écrire du code propre et élégant comme ceci:
La ligne de code ci-dessus renvoie une liste des carrés des nombres dans la liste. Bien sûr, vous pouvez également le faire comme:
Il est évident que l'ancien code est plus court, et cela est particulièrement vrai si vous avez l'intention d'utiliser la fonction de carte (ou toute fonction similaire qui prend une fonction comme paramètre) en un seul endroit. Cela rend également le code plus intuitif et élégant.
En outre, comme @David Zaslavsky l'a mentionné dans sa réponse, la compréhension des listes n'est pas toujours la voie à suivre, surtout si votre liste doit obtenir des valeurs d'une manière mathématique obscure.
D'un point de vue plus pratique, l'un des plus grands avantages des lambdas pour moi récemment a été la GUI et la programmation événementielle. Si vous regardez les rappels dans Tkinter, tout ce qu'ils prennent comme arguments est l'événement qui les a déclenchés. Par exemple
Et si vous aviez des arguments à passer? Quelque chose d'aussi simple que de passer 2 arguments pour stocker les coordonnées d'un clic de souris. Vous pouvez facilement le faire comme ceci:
Vous pouvez maintenant affirmer que cela peut être fait à l'aide de variables globales, mais voulez-vous vraiment vous cogner la tête en vous inquiétant de la gestion de la mémoire et des fuites, surtout si la variable globale ne sera utilisée qu'à un endroit particulier? Ce serait juste un mauvais style de programmation.
En bref, les lambdas sont géniaux et ne devraient jamais être sous-estimés. Les lambdas Python ne sont pas les mêmes que les lambdas LISP (qui sont plus puissants), mais vous pouvez vraiment faire beaucoup de choses magiques avec eux.
la source
main
etdo_something_cool
? Qu'arrive-t-il àx
ety
dans la fonction? Les valeurs transmises semblent être immédiatement écrasées? Comment la fonction est-elle informéeevent
? Pourriez-vous ajouter quelques commentaires / explications? Mercix
ety
comme arguments àdo-something-cool
et leurs valeurs sont définies dans la fonction pour illustrer comment vous pouvez utiliser lambdas pour passer des arguments là où aucun n'est attendu. Lawidget.bind
fonction attend unevent
paramètre qui identifie l'événement GUI sur ce widget particulier. Je recommande de lire sur le modèle de programmation de Tkinter pour plus de clarté.x,y
alors faitesx=event.x
. Cela n'écrase-t-il pas la valeur que vous avez transmise? Et comment la fonction sait-elle ce qu'estevent
? Je ne vois pas où vous passez cela à la fonction. Ou est-ce une méthode? Êtes-vous également autorisé à utiliser les signes moins dans un nom de fonction?x, y
, ce n'est qu'un exemple à des fins d'illustration. J'essaie de montrer le pouvoir des lambdas, pas de Tkinter. :)event
? dans ce cas, votre lambda ne devrait-il pas lirelambda event: do_something_cool(event,x,y)
?Les lambdas sont profondément liés au style de programmation fonctionnel en général. L'idée que vous pouvez résoudre des problèmes en appliquant une fonction à certaines données et en fusionnant les résultats, est ce que Google utilise pour implémenter la plupart de ses algorithmes.
Les programmes écrits dans un style de programmation fonctionnel sont facilement parallélisés et deviennent donc de plus en plus importants avec les machines multicœurs modernes. Donc en bref, NON, vous ne devez pas les oublier.
la source
Premiers félicitations qui ont réussi à comprendre lambda. À mon avis, c'est une construction vraiment puissante pour agir avec. La tendance actuelle vers les langages de programmation fonctionnels est certainement un indicateur qu'il ne faut ni l'éviter ni le redéfinir dans un avenir proche.
Il suffit de penser un peu différemment. Je suis sûr que vous allez bientôt l'adorer. Mais soyez prudent si vous ne traitez qu'avec python. Parce que le lambda n'est pas une vraie fermeture, il est "cassé" en quelque sorte: les pythons lambda sont cassés
la source
Notez que ce n'est pas une condamnation de quoi que ce soit. Tout le monde a un ensemble différent de choses qui ne viennent pas facilement.
Non.
Ce n'est pas obscur. Les 2 dernières équipes sur lesquelles j'ai travaillé, tout le monde a utilisé cette fonctionnalité tout le temps.
Je n'ai vu aucune proposition sérieuse pour le redéfinir en Python, à part corriger la sémantique de fermeture il y a quelques années.
Ce n'est pas moins clair, si vous l'utilisez correctement. Au contraire, avoir plus de constructions de langage disponibles augmente la clarté.
Lambda est comme un débordement de tampon? Sensationnel. Je ne peux pas imaginer comment vous utilisez lambda si vous pensez que c'est un "cauchemar de maintenance".
la source
J'utilise des lambdas pour éviter la duplication de code. Cela rendrait la fonction facilement compréhensible. Par exemple:
Je remplace ça par un lambda temp
la source
J'ai commencé à lire le livre de David Mertz aujourd'hui «Text Processing in Python». Bien qu'il ait une description assez concise de Lambda, les exemples du premier chapitre combinés à l'explication de l'annexe A les ont fait sauter la page pour moi (enfin) et tout d'un coup j'ai compris leur valeur. Cela ne veut pas dire que son explication fonctionnera pour vous et je suis encore au stade de la découverte, donc je n'essaierai pas d'ajouter à ces réponses autres que les suivantes: je suis nouveau sur Python je suis nouveau sur OOP Lambdas était une lutte pour moi Maintenant que j'ai lu Mertz, je pense que je les ai et je les vois aussi très utiles que je pense qu'ils permettent une approche plus propre de la programmation.
Il reproduit le Zen of Python, dont une ligne est simple, c'est mieux que complexe. En tant que programmeur non-OOP lisant du code avec lambdas (et jusqu'à la semaine dernière, liste des compréhensions), j'ai pensé: c'est simple? . J'ai finalement réalisé aujourd'hui que ces fonctionnalités rendent le code beaucoup plus lisible et compréhensible que l'alternative, qui est invariablement une boucle. J'ai également réalisé que, comme les états financiers, Python n'était pas conçu pour l'utilisateur novice, mais plutôt pour l'utilisateur qui veut s'instruire. Je ne peux pas croire à quel point ce langage est puissant. Quand j'ai compris (enfin) le but et la valeur des lambdas, j'ai voulu déchirer environ 30 programmes et recommencer à mettre des lambdas le cas échéant.
la source
Un cas utile pour l'utilisation de lambdas est d' améliorer la lisibilité des compréhensions de longue liste . Dans cet exemple,
loop_dic
c'est court pour la clarté, mais imaginezloop_dic
être très long. Si vous utilisiez simplement une valeur simple qui incluti
au lieu de la version lambda de cette valeur, vous obtiendrez unNameError
.Au lieu de
la source
Je peux vous donner un exemple où j'avais réellement besoin de lambda sérieux. Je fais un programme graphique, où l'utilisation clique avec le bouton droit sur un fichier et lui attribue l'une des trois options. Il s'avère que dans Tkinter (le programme d'interface GUI dans lequel j'écris ceci), lorsque quelqu'un appuie sur un bouton, il ne peut pas être affecté à une commande qui accepte des arguments. Donc, si j'ai choisi l'une des options et que je voulais que le résultat de mon choix soit:
Alors ce n'est pas grave. Mais si j'ai besoin de mon choix pour avoir un détail particulier. Par exemple, si je choisis le choix A, il appelle une fonction qui accepte un argument qui dépend du choix A, B ou C, TKinter ne pourrait pas le prendre en charge. Lamda était la seule option pour contourner cela en fait ...
la source
def foo...
, puis être passé à lafoo
place delambda
. C'est juste plus de code et vous devez trouver un nom.Je l'utilise assez souvent, principalement comme objet nul ou pour lier partiellement des paramètres à une fonction.
Voici quelques exemples:
pour implémenter un modèle d'objet nul:
pour la liaison de paramètres:
disons que j'ai l'API suivante
Ensuite, quand je ne veux pas vider rapidement les données reçues dans un fichier, je le fais:
la source
j'utilise
lambda
pour créer des rappels qui incluent des paramètres. Il est plus simple d'écrire un lambda sur une seule ligne que d'écrire une méthode pour effectuer la même fonctionnalité.Par exemple:
par opposition à:
la source
Je suis un débutant en python, donc pour avoir une idée claire de lambda, je l'ai comparé avec une boucle 'for'; en termes d'efficacité. Voici le code (python 2.7) -
la source
timeit
module, qui donne généralement des résultats plus précis que la soustraction detime.time()
valeurs.Lambda est un constructeur de procédures. Vous pouvez synthétiser des programmes au moment de l'exécution, bien que le lambda de Python ne soit pas très puissant. Notez que peu de gens comprennent ce type de programmation.
la source