Pourquoi Python lambdas utile?
Je suis à essayer de comprendre Python lambdas. Est lambda un de ces "intéressant" en langue que dans la vie réelle doit être oublié?
Je suis sûr qu'il y a certains cas où il peut être nécessaire, mais compte tenu de l'obscurité, le potentiel de redéfinir les futures versions (mon hypothèse fondée sur les diverses définitions de celle-ci) et la réduction de la codification de la clarté - devrait-il être évité?
Cela me rappelle de débordement (dépassement de tampon) de types C - pointant vers le haut de la variable ou de la surcharge pour régler les autres valeurs de champ. Il se sent comme une sorte de pointe de la technique de mise en scène, mais l'entretien codeur cauchemar.
- +1 Bonne question - des hypothèses erronées (l'obscurité de la lambda) =) Essayez de ne pas porter de jugement sur les techniques de programmation. Les évaluer et de les ajouter à votre mental toolkit. Si vous ne les aimez pas, ne les utilisez pas, et être prêt à discuter de façon logique, sans devenir religieux.
- Haskell Règles! Lambda fonctions vous donne de l'expressivité et de l'abstraction de la puissance.
- Pour ne pas mentionner LISP...
- c'est votre père Parenthèse. Plus civilisé arme de plus civilisé de l'âge." - Obi Lisp Kenobi
- Pourquoi utiliser les lambda fonctions?
Vous devez vous connecter pour publier un commentaire.
Tu parles lambda fonctions? Comme
Ces choses sont en fait très utile. Python supporte un style de programmation appelé de la programmation fonctionnelle où vous pouvez passer des fonctions à d'autres fonctions à faire des trucs. Exemple:
jeux de
mult3
à[3, 6, 9]
, les éléments de la liste d'origine qui sont des multiples de 3. C'est plus courte (et, pourrait-on argumenter, plus claire) queBien sûr, dans ce cas particulier, on pourrait faire la même chose qu'une compréhension de liste:
(ou même comme
range(3,10,3)
), mais il y a beaucoup d'autres, plus sophistiquées cas où vous ne pouvez pas utiliser une liste de compréhension et d'une fonction lambda peut être le chemin le plus court à écrire quelque chose.Retour d'une fonction à partir d'une autre fonction
Il est souvent utilisé pour créer la fonction wrappers, tels que le Python, les décorateurs.
Combinant des éléments d'un objet iterable séquence avec
reduce()
De tri par une autre clé
- Je utiliser les lambda fonctions sur une base régulière. Il m'a fallu un certain temps pour s'y habituer, mais finalement j'en suis venu à comprendre qu'ils sont une précieuse partie de la langue.
','.join(str(x) for x in [1,2,3,4,5,6,7,8,9])
lambda
fonctions peuvent être anonymes (comme ils le sont dans tous les exemples). Si vous assignez unlambda
la fonction de quelque chose, alors vous le faites mal et doit utiliserdef
au lieulambda
est juste une façon élégante de direfunction
. Autre que son nom, il n'y a rien d'obscur, d'intimider ou de cryptic à ce sujet. Quand vous lisez la ligne suivante, remplacezlambda
parfunction
dans votre esprit:Juste définit une fonction de
x
. Quelques autres langues, commeR
, le dire explicitement:Vous voir? C'est l'un de la plus naturelle des choses à faire dans la programmation.
lambda
très simple à comprendre. Merci!lambda
parfunction
dans votre esprit et ajouterreturn
avant dernière expressiontype(lambda x: 3)
.lambda
expressions etdef
déclarations de générer à la foisfunction
objets; c'est seulement la syntaxe d'unelambda
expression que les limites de que cas, il peut produire.type(lambda x: x[1] = 2)
Le contenu d'un lambda doit être exactement la même expression. C'est moins expressive que la pleine langue.lambda
expression ne signifie pas le résultat d'unelambda
expression n'est pas une fonction.Les deux résumé en ligne:
lambda
mot-clé: inutile, de temps en temps utiles. Si vous vous retrouver à faire quelque chose à distance complexes avec elle, de la mettre à l'écart et de définir une fonction réelle.Un lambda fait partie d'un important mécanisme d'abstraction qui traite des fonctions d'ordre supérieur. Pour obtenir une bonne compréhension de sa valeur, s'il vous plaît regarder de haute qualité leçons de Abelson et Sussman, et de lire le livre SICP
Ce sont des questions pertinentes dans le logiciel moderne entreprises, et de plus en plus populaire.
lambda
s et de première classe de fonctions. Python est extrêmement limitéelambda
déclaration, mais entièrement de première classe de fonctions. La seule différence est que vous devez citer les fonctions que vous voulez passer.Je doute lambda ira loin.
Voir Guido post parle finalement d'abandonner la tentative de l'enlever. Voir aussi un aperçu du conflit.
Vous pouvez consulter ce post pour plus d'une histoire au sujet de l'affaire derrière Python caractéristiques fonctionnelles:
http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html
Mes deux cents: il est Rarement lambda vaut autant que la clarté va. Généralement, il y a une solution qui ne comprend pas le lambda.
lambdas sont extrêmement utiles dans la programmation GUI. Par exemple, disons que vous êtes en train de créer un groupe de boutons et vous souhaitez utiliser un seul paramaterized de rappel plutôt que d'un unique rappel par bouton. Lambda permet d'accomplir avec facilité:
(Note: bien que cette question est précisément de demander à propos de
lambda
, vous pouvez également utiliser functools.partielle pour obtenir le même type de résultat)L'alternative est de créer un rappel pour chaque bouton qui peut conduire à des duplications de code.
value
est défini dans une boucle; dans l'autre exemple, le paramètre toujours eu qu'une seule valeur. Lorsque vous ajoutez quelque chose commearg=value
, vous êtes à la fixation de la valeur actuelle de la fonction de rappel. Sans elle, vous lier une référence à la variable dans la fonction de rappel. La référence contient toujours la valeur finale de la variable, depuis le rappel arrive peu de temps après que la boucle a déjà fini de s'exécuter.functools.partial()
qui permet de le faire avec moins de trucs (et sanslambda
).functools.partial
nécessite une bibliothèque d'importation, et pour la plupart des cas simples lambda est plus que suffisant.partial(my_callback, value)
vslambda arg=value: my_callback(arg)
- le lambda a beaucoup plus de trucs (affectation à arg, puis l'utilisation), et il est moins clair que l'intention est (vous pourriez faire quelque chose de subtilement différent dans le lambda). Les importations ne sont pas vraiment un problème (vous avez un tas de toute façon et c'est une fois par fichier). Le Code est le meilleur jugée sur la façon dont il lit, etpartial()
est beaucoup plus facile à lire que le lambda.En Python,
lambda
est juste une façon de définir des fonctions inline,et..
..sont les exacte même.
Il n'y a rien que vous pouvez faire avec lambda qui vous ne pouvez pas faire avec une fonction régulière Python fonctions sont un objet tout comme toute autre chose, et les lambdas il vous suffit de définir une fonction:
Honnêtement, je pense que le
lambda
mot-clé est redondante en Python—je n'ai jamais eu le besoin de les utiliser (ou vu utilisé lorsqu'une fonction régulière, une liste-de la compréhension ou de l'une des nombreuses fonctions internes qui aurait pu être mieux utilisé à la place)Complètement aléatoire exemple, à partir de l'article "Python lambda est cassé!":
Je dirais, même si cela fait un travail, c'est horriblement et "unpythonic", la même fonctionnalité peut être écrit d'innombrables autres façons, par exemple:
Oui, ce n'est pas la même, mais j'ai jamais vu une cause où la génération d'un groupe de lambda fonctions dans une liste a été nécessaire. Il peut être judicieux dans d'autres langues, mais Python n'est pas Haskell (ou Lisp, ou ...)
Edit:
Il y a quelques cas où lambda est utile, par exemple, il est souvent pratique lors de la connexion des signaux en PyQt applications, comme ceci:
Juste faire
w.textChanged.connect(dothing)
pourrait appeler ladothing
méthode avec un supplément deevent
argument et de provoquer une erreur. En utilisant le lambda moyen, on peut bien placé, baisse de l'argument sans avoir à définir un emballage de fonction.a
's que vous avez définis sont pas exactement de même. 🙂 Ils diffèrent par__name__
champ au moins...Je trouve lambda utile pour une liste de fonctions qui font la même chose, mais pour des circonstances différentes. Comme le Mozilla pluriel règles.
Si vous aviez à définir une fonction pour tous ceux que vous souhaitez faire de mad par la fin de celui-ci. Aussi, il ne serait pas gentil avec les noms de fonction comme
plural_rule_1
,plural_rule_2
, etc. Et vous auriez besoin deeval()
lorsque vous êtes en fonction sur une variable de la fonction id.À peu près tout ce que vous pouvez faire avec
lambda
vous pouvez faire mieux avec soit nommé à des fonctions ou de la liste et le générateur d'expressions.Par conséquent, pour la plupart, vous devriez juste un de ces dans pratiquement n'importe quelle situation (sauf peut-être pour gratter le code écrit dans interactive interprète).
J'ai été à l'aide de Python depuis quelques années et je n'ai jamais couru dans un cas où j'ai nécessaire lambda. Vraiment, que la tutoriel états, c'est juste pour le sucre syntaxique.
Je ne peux pas parler de python particulier la mise en œuvre de la lambda, mais en général, les lambda fonctions sont vraiment à portée de main. Ils sont une base technique (peut-être même de LA technique) de la programmation fonctionnelle, et ils sont également très useuful dans des programmes orientés objet. Pour certains types de problèmes, ils sont la meilleure solution, donc certainement ne devrait pas être oublié!
Je vous suggère de lire sur fermetures et la fonction map (que des liens vers python docs, mais il existe dans presque toutes les langues qui prend en charge constructions fonctionnelles) pour voir pourquoi c'est utile.
Fonction Lambda c'est un non-bureaucratique de façon à créer une fonction.
Que c'est. Par exemple, supposons supose que vous avez votre fonction principale et besoin de place des valeurs. Nous allons voir de façon traditionnelle et le lambda moyen de le faire:
De façon traditionnelle:
Le lambda moyen:
Voir la différence?
Lambda fonctions vont très bien avec les listes, comme les listes des compréhensions ou de la carte. En fait, la compréhension de liste, c'est un "pythonic" façon de vous exprimer à l'aide de lambda. Ex:
Nous allons voir ce que chacun des éléments de la syntaxe signifie:
Qui est pratique euh? La création de fonctions de ce genre. Réécrivons l'aide lambda:
Maintenant, nous allons utiliser la carte, qui est la même chose, mais plus de la langue. Cartes prend 2 arguments:
(i) une fonction
(ii) un objet iterable
Et vous donne une liste où chaque élément de la fonction appliquée à chaque élément de l'objet iterable.
Ainsi, l'utilisation de la carte, nous aurions:
Si vous maîtrisez les lambdas et de la cartographie, vous aurez un grand pouvoir de manipuler les données et de manière concise. Lambda fonctions ne sont ni obscur, ni retirer le code de la clarté. Ne confondez pas quelque chose de dur avec quelque chose de nouveau. Une fois que vous commencez à les utiliser, vous trouverez qu'il est très clair.
Une des belles choses au sujet de
lambda
c'est à mon avis sous-estimées, c'est que c'est la façon de reporter à une évaluation pour des formes simples, jusqu'à la valeur nécessaire. Laissez-moi vous expliquer.De nombreuses routines de la bibliothèque sont mis en œuvre de manière à permettre à certains paramètres callables (dont lambda est un). L'idée est que la valeur réelle sera calculée uniquement au moment où il va être utilisé (plutôt que lorsqu'elle est appelée). Un (fictive) exemple peut aider à illustrer ce point. Supposons que vous avez une routine qui allait faire du journal un timestamp. Vous voulez la routine d'utiliser l'heure actuelle moins de 30 minutes. Vous souhaitez appeler comme
Supposons maintenant que la fonction réelle va être appelée uniquement lorsqu'un certain événement se produit et que vous voulez le timestamp être calculées qu'à l'époque. Vous pouvez faire cela comme
En supposant que le
log_timestamp
peut gérer callables comme ça, il va évaluer ce quand il en a besoin et vous obtiendrez le timestamp de l'époque.Il y a bien sûr d'autres façons de le faire (à l'aide de la
operator
module par exemple), mais j'espère que je vous ai transmis le point.Mise à jour: Ici est un peu plus concrète l'exemple du monde réel.
Mise à jour 2: je pense que c'est un exemple de ce qu'on appelle un thunk.
Comme indiqué ci-dessus, le lambda de l'opérateur en Python définit une fonction anonyme, et dans les fonctions Python sont des fermetures. Il est important de ne pas confondre la notion de fermetures avec l'opérateur lambda, qui est purement syntaxique de la méthadone pour eux.
Quand j'ai commencé à en Python il y a quelques années, j'ai utilisé des lambdas beaucoup, pensant qu'ils étaient cool, avec des interprétations de la liste. Cependant, j'ai écrit et d'avoir à maintenir un grand 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 pourrait être OK pour le prototype de choses avec, mais n'offre plus de fonctions inline (nommé fermetures), sauf pour l'enregistrement de quelques-stokes, ou parfois pas.
En gros, cela revient à plusieurs points:
C'est une raison suffisante pour autour d'eux et de les convertir nommé fermetures. Cependant, je suis titulaire de deux autres rancunes contre anonyme fermetures.
La première rancune est tout simplement qu'ils sont juste de l'autre de mots clés inutiles qui encombrent la langue.
La deuxième rancune est plus profond et sur le paradigme de niveau, c'est à dire que je n'aime pas, ils contribuent à une fonctionnelle de style de programmation, parce que le style est moins flexible que le passage de messages, orienté-objet, de forme ou de procédure styles, parce que le lambda calcul n'est pas Turing-complet (heureusement en Python, on peut encore sortir de cette restriction, même à l'intérieur d'un lambda). Les raisons je me sens lambdas promouvoir ce style sont:
Il y a un rendement implicite, c'est à dire qu'ils semblent comme ils "devraient" être des fonctions.
Ils sont une alternative état-cacher le mécanisme à l'autre, plus explicite, plus lisible, plus réutilisable et plus de mécanisme général: méthodes.
Je m'efforce d'écrire des lambda-gratuit Python, et de supprimer les lambdas à vue. Je pense que Python serait un peu mieux la langue sans lambdas, mais c'est juste mon avis.
Y = lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))
Lambdas sont effectivement très puissant des constructions que les souches à partir d'idées dans la programmation fonctionnelle, et c'est quelque chose qui, par aucun moyen sera facilement révisé, redéfini ou retiré dans un avenir proche de Python. Ils vous aider à écrire du code qui est plus puissant car il permet de passer des fonctions en tant que paramètres, ainsi, l'idée de fonctions comme des citoyens de première classe.
Lambdas ne ont tendance à obtenir déroutant, mais une fois une solide connaissance est obtenue, vous pouvez écrire nettoyer élégant de code comme ceci:
Au-dessus de la ligne de code renvoie une liste des carrés des nombres dans la liste. Bien sûr, vous pouvez aussi faire il aime:
Il est évident que le code est plus court, et cela est particulièrement vrai si vous avez l'intention d'utiliser la fonction map (ou de toute autre fonction qui prend une fonction en tant que paramètre) dans un seul endroit. Également, cela rend le code plus intuitive et élégante.
Aussi, comme @David Zaslavsky mentionné dans sa réponse, interprétations de la liste ne sont pas toujours la voie à suivre, surtout si votre liste a pour obtenir les valeurs de quelque obscure manière mathématique.
D'un point de vue pratique, l'un des plus grands avantages de lambdas pour moi a été récemment dans l'interface graphique et la programmation événementielle. Si vous jetez un oeil à des rappels dans Tkinter, tous ils prennent comme arguments sont l'événement qui a déclenché eux. E. g.
Maintenant, 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:
Maintenant, vous pouvez faire valoir que cela peut être fait en utilisant des variables globales, mais voulez-vous vraiment bang votre tête vous soucier de la gestion de la mémoire et de la fuite en particulier si la variable globale sera utilisé uniquement dans un endroit particulier? Ça serait juste mauvais style de programmation.
En bref, les lambdas sont géniaux, et ne devrait jamais être sous-estimée. Python lambdas ne sont pas les mêmes que LISP lambdas mais (qui sont de plus en plus puissants), mais vous pouvez vraiment faire beaucoup de trucs magiques avec eux.
main
etdo_something_cool
? Ce qui se passe àx
ety
dans la fonction? Les valeurs passées semblent être immédiatement remplacé? Comment fonctionne la fonction savoir surevent
? Pourriez-vous ajouter quelques commentaires / explications? Mercix
ety
comme arguments pourdo-something-cool
et leurs valeurs sont définies dans la fonction pour illustrer comment vous pouvez utiliser les lambdas pour passer des arguments où aucun n'est prévu. Lewidget.bind
fonction attend unevent
paramètre qui identifie l'interface graphique de l'événement sur ce widget. Je vous recommande la lecture sur Tkinter du modèle de programmation pour plus de clarté.x,y
puis fairex=event.x
. Ne pas écraser la valeur de vous passé? Et comment fonctionne la fonction de savoir ce queevent
est? Je ne vois pas où vous transmettez à la fonction. Ou est-il une méthode? Aussi est-il permis signes moins un nom de fonction?x, y
, c'est juste un exemple pour illustrer. Je suis en train de montrer la puissance de lambdas, pas Tkinter. 🙂event
? dans ce cas, ne faut-il pas votre lambda lirelambda event: do_something_cool(event,x,y)
?event
en tant que paramètre. Votre fonctiondo-something-cool
prend 3 paramètres, mais vous ne le passez deux,x
ety
. Ai-je raté quelque chose? Avez-vous testé ce code?do-something-cool
. Doncdo-something-cool
prend 3 paramètres. C'est en fait la façon dont les lambdas de travail et oui, j'ai utilisé ce code dans une application, puis posté ici. 🙂Lambdas sont profondément liés à la programmation fonctionnelle style en général. L'idée que vous pouvez résoudre les problèmes par l'application d'une fonction de certaines données, et en fusionnant les résultats, est ce que google utilise pour mettre en œuvre la plupart de ses algorithmes.
Les programmes écrits en programmation fonctionnelle, le style, sont facilement parallélisable et donc sont de plus en plus et de plus en plus important avec moderne multi-core machines.
Donc, en bref, NON, vous ne devez pas oublier.
D'abord félicitations que réussi à comprendre lambda. À mon avis, c'est vraiment puissante construction d'agir avec. La tendance ces jours-ci vers les langages de programmation fonctionnelle est certainement un indicateur qu'il ne doit pas non plus être évité, ni qu'il sera redéfini dans un avenir proche.
Vous suffit de réfléchir un peu différent. Je suis sûr que bientôt vous allez l'adorer. Mais attention, si vous ne traitez qu'avec python. Parce que le lambda n'est pas un véritable fermeture, il est "cassé" en quelque sorte: pythons lambda est cassé
Je utiliser les lambdas pour éviter la duplication de code. Il ferait de la fonction, facilement compréhensible
Par exemple:
Je la remplacer avec une temp lambda
Noter 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.
Pas.
Il n'est pas obscur. Les 2 dernières équipes qui j'ai travaillé, tout le monde à utiliser cette fonctionnalité tout le temps.
Je n'ai pas vu de propositions sérieuses de la redéfinir en Python, au-delà de la fixation de la fermeture de la sémantique il y a quelques années.
Il n'est pas moins clair, si vous avez droit. Au contraire, avoir plus de constructions de langage disponible augmente clarté.
Lambda, c'est comme dépassement de la mémoire tampon? Wow. Je ne peux pas imaginer comment vous utilisez lambda si vous pensez que c'est un "entretien cauchemar".
J'ai commencé à lire David Mertz du livre d'aujourd'hui " Traitement de Texte en Python.' Alors qu'il a une assez laconique description de Lambda les exemples dans le premier chapitre, combiné avec l'explication donnée dans l'Annexe A fait sauter hors de la page pour moi (enfin) et tout d'un coup j'ai compris leur valeur. Cela ne veut pas dire son explication va travailler pour vous et je suis encore à la découverte, je ne vais donc pas tenter d'ajouter à ces réponses autres que les suivants:
Je suis nouveau sur Python
Je suis nouveau dans la programmation orientée objet
Les Lambdas sont un combat pour moi
Maintenant que j'ai lu Mertz, je pense que je les reçois et je les vois comme très utile car je pense qu'ils permettent une plus propre approche de la programmation.
Il reproduit le Zen de Python, une seule ligne de ce qui est Simple est mieux que d'être compliqué. en tant Que non-OOP programmeur lecture de code avec les lambdas (et jusqu'à la semaine dernière interprétations de la liste), j'ai pensé-C'est simple?. J'ai finalement réalisé aujourd'hui qu'en fait, ces caractéristiques rendent le code plus lisible et compréhensible que l'autre alternative, ce qui est toujours une boucle en quelque sorte. J'ai aussi réalisé que, comme les états financiers-Python n'a pas été conçu pour l'utilisateur novice, c'est plutôt conçu pour l'utilisateur qui veut s'informer. Je ne peux pas croire à la puissance de cette langue. Quand il m'est apparu (enfin) le but et la valeur de lambda je voulais déchirer jusqu'à 30 programmes et recommencer la mise en lambdas, le cas échéant.
Un cas utile pour l'utilisation de lambda est à améliorer la lisibilité de la longue liste des compréhensions.
Dans cet exemple
loop_dic
est court pour plus de clarté, mais imaginezloop_dic
être très long. Si vous utilisez un simple valeur qui incluti
au lieu de le lambda version de cette valeur, vous obtiendrez uneNameError
.Au lieu de
Je suis un débutant en python, donc à getter une idée claire de lambda je l'ai comparé avec un "pour" boucle; en termes d'efficacité.
Voici le code (python 2.7) -
timeit
module, ce qui donne généralement des résultats plus précis que la soustractiontime.time()
valeurs.Je peux vous donner un exemple où j'ai réellement besoin lambda grave. Je suis en train de faire un programme graphique, où l'utilisation clique droit sur un fichier et l'attribue à l'une des trois options. Il s'avère que dans Tkinter (l'interface graphique de l'interfaçage programme que j'ai écris ceci dans), lorsque quelqu'un appuie sur un bouton, il ne peut pas être attribué à une commande qui prend en arguments. Donc, si j'ai choisi l'une des options et je voulais le résultat de mon choix:
Puis pas une grosse affaire. Mais que faire si j'ai besoin de mon choix d'avoir un détail particulier. Par exemple, si je choisis Un choix, il appelle une fonction qui prend un argument qui est dépendant du choix A, B ou C, TKinter, pourrait ne pas appuyer cette démarche. Lamda était la seule option pour obtenir autour de cette réalité...
def foo...
et ensuite transmis enfoo
au lieu delambda
. C'est juste plus de code et vous devez venir avec un nom.Je l'utilise assez souvent, surtout en tant que objet null ou partiellement lier des paramètres à une fonction.
Voici des exemples:
pour mettre en œuvre l'objet null motif:
pour la liaison de paramètre:
disons que j'ai l'API suivante
Puis, quand j'ai wan pas rapidement vider le reçu de données dans un fichier je n'ai que:
- Je utiliser
lambda
pour créer des rappels qui comprennent des paramètres. C'est plus propre de l'écriture d'un lambda dans une ligne que d'écrire une méthode pour effectuer la même fonctionnalité.Par exemple:
par opposition à:
Lambda est une procédure constructeur. Vous pouvez synthétiser les programmes au moment de l'exécution, bien que Python lambda n'est pas très puissant. Remarque que peu de gens comprennent ce genre de programmation.