Question Pourquoi les lambdas Python sont-ils utiles? [fermé]


J'essaie de comprendre Python lambdas. Lambda est-il l'un de ces éléments de langage "intéressants" qui, dans la vie réelle, devraient être oubliés?

Je suis sûr qu'il y a des cas limites où cela pourrait être nécessaire, mais étant donné l'obscurité de la situation, le potentiel de redéfinition dans les versions futures (mon hypothèse basée sur les diverses définitions) et la clarté de codage réduite - devrait-il être évité?

Cela me rappelle le débordement (buffer overflow) de types C - pointant vers la variable supérieure et la surcharge pour définir les autres valeurs de champ. Cela ressemble à un showman de technophile mais à un cauchemar de codeur d'entretien.


813
2018-05-20 20:40


origine


Réponses:


Parlez-vous de fonctions lambda? Comme

lambda x: x**2 + 2*x - 5

Ces choses sont vraiment 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])

ensembles 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) 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 qu'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 beaucoup d'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.

  • Renvoyer une fonction d'une autre fonction

    >>> def transform(n):
    ...     return lambda x: x + n
    ...
    >>> f = transform(3)
    >>> f(4)
    7
    

    Ceci est souvent utilisé pour créer des wrappers de fonctions, tels que les décorateurs de Python.

  • Combiner des éléments d'une séquence itérable avec reduce()

    >>> reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])
    '1, 2, 3, 4, 5, 6, 7, 8, 9'
    
  • Tri par une clé alternative

    >>> sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
    [5, 4, 6, 3, 7, 2, 8, 1, 9]
    

J'utilise régulièrement les fonctions lambda. Il m'a fallu du temps pour m'y habituer, mais j'ai fini par comprendre qu'ils étaient une partie très précieuse de la langue.


892
2018-05-20 20:52



lambda est juste une façon élégante de dire function. Autre que son nom, il n'y a rien obscur, intimidant ou cryptique à ce sujet. Lorsque vous lisez la ligne suivante, remplacez lambda par function dans ta tête:

>>> f = lambda x: x + 1
>>> f(3)
4

Il définit simplement une fonction de x. Quelques autres langues, comme R, dites-le explicitement:

> f = function(x) { x + 1 }
> f(3)
4

Tu vois? C'est l'une des choses les plus naturelles à faire en programmation.


322
2018-01-16 15:03



Le résumé de deux lignes:

  1. Fermetures: Très utile. Apprenez-les, utilisez-les, aimez-les.
  2. Python lambda mot-clé: inutile, occasionnellement utile. Si vous vous trouvez en train de faire quelque chose de complexe, rangez-le et définissez une fonction réelle.

93
2018-05-20 22:37



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 des leçons de haute qualité Abelson et Sussmanet lisez le livre SICP

Ce sont des questions pertinentes dans les affaires de logiciels modernes, et de plus en plus populaire.


71
2018-05-20 20:49



Je doute que lambda s'en aille. Voir Le message de Guido à propos de renoncer finalement à essayer de l'enlever. Regarde aussi un aperçu du conflit.

Vous pouvez consulter ce post 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 de carte, de filtrage et de réduction qui ont initialement motivé l'introduction de lambda et d'autres caractéristiques fonctionnelles ont été dans une large mesure remplacées par des compréhensions de liste et des expressions de générateur. En fait, la fonction de réduction a été supprimée de la liste des fonctions intégrées dans Python 3.0. (Cependant, il n'est pas nécessaire d'envoyer des plaintes concernant l'enlèvement de lambda, carte ou filtre: ils restent. :-)

Mes propres deux cents: Rarement lambda vaut la peine dans la mesure où la clarté va. Généralement, il existe une solution plus claire qui n'inclut pas lambda.


57
2018-05-20 20:46



Les lambdas sont extrêmement utiles dans la programmation graphique. Par exemple, disons que vous créez un groupe de boutons et que vous souhaitez utiliser un seul rappel paramétré plutôt qu'un rappel unique par bouton. Lambda vous permet d'accomplir cela facilement:

for value in ["one","two","three"]:
    b = tk.Button(label=value, command=lambda arg=value: my_callback(arg))
    b.pack()

(Note: bien que cette question pose spécifiquement des questions sur lambda, vous pouvez aussi 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 conduire à un code dupliqué.


56
2018-04-24 16:48



En Python, lambda est juste un moyen de définir les fonctions en ligne,

a = lambda x: x + 1
print a(1)

et..

def a(x): return x + 1
print a(1)

..sont les exact même.

Il n'y a rien que vous puissiez faire avec lambda, ce que vous ne pouvez pas faire avec une fonction régulière - dans Python, les fonctions sont un objet comme n'importe quoi d'autre, et lambdas définit simplement une fonction:

>>> a = lambda x: x + 1
>>> type(a)
<type 'function'>

Je pense sincèrement que lambda le mot-clé est redondant en Python - je n'ai jamais eu besoin de les utiliser (ou vu celui utilisé où une fonction régulière, une compréhension de liste ou une des nombreuses fonctions intégrées aurait pu être mieux utilisée à la place)

Pour un exemple complètement aléatoire, de l'article "Le lambda de Python est cassé!":

Pour voir comment lambda est cassé, essayez de générer une liste de fonctions fs=[f0,...,f9] où fi(n)=i+n. Premier essai:

>>> fs = [(lambda n: i + n) for i in range(10)]
>>> fs[3](4)
13

Je dirais que, même si cela a fonctionné, c'est horriblement "impythonique", la même fonctionnalité pourrait être écrite d'innombrables autres façons, par exemple:

>>> n = 4
>>> [i + n for i in range(10)]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

Oui, ce n'est pas pareil, mais j'ai jamais vu une cause où la génération d'un groupe de fonctions lambda dans une liste a été nécessaire. Cela peut avoir du sens dans d'autres langues, mais Python n'est pas Haskell (ou Lisp, ou ...)

S'il vous plaît noter que nous pouvons utiliser lambda et encore atteindre le désiré   résulte de cette façon:

>>> fs = [(lambda n,i=i: i + n) for i in range(10)]
>>> fs[3](4)
7

Modifier:

Il y a quelques cas où lambda est utile, par exemple il est souvent pratique de connecter des signaux dans des applications PyQt, comme ceci:

w = PyQt4.QtGui.QLineEdit()
w.textChanged.connect(lambda event: dothing())

Je fais juste w.textChanged.connect(dothing) appellerait le dothing méthode avec un extra event argument et provoquer une erreur. En utilisant les moyens lambda, nous pouvons laisser tomber l'argument sans avoir à définir une fonction d'enveloppement.


31
2018-05-21 02:03



Je trouve lambda utile pour une liste de fonctions qui font la même chose, mais pour des circonstances différentes. Comme le Mozilla règles du pluriel.

plural_rules = [
    lambda n: 'all',
    lambda n: 'singular' if n == 1 else 'plural',
    lambda n: 'singular' if 0 <= n <= 1 else 'plural',
    ...
]
# Call plural rule #1 with argument 4 to find out which sentence form to use.
plural_rule[1](4) # returns 'plural'

Si vous deviez définir une fonction pour tous ceux-là, vous deviendriez fous à la fin. Aussi ce ne serait pas bien avec les noms de fonctions comme plural_rule_1, plural_rule_2, etc. Et vous auriez besoin de eval() quand vous dépendez d'un identifiant de fonction variable.


28
2018-01-16 15:43



À peu près tout ce que vous pouvez faire avec lambda vous pouvez faire mieux avec des fonctions nommées ou des expressions de liste et de générateur.

Par conséquent, pour la plupart, vous ne devriez en avoir qu'une dans n'importe quelle situation (sauf peut-être pour le code à gratter écrit dans l'interpréteur interactif).


26
2018-05-20 20:45