Frage Warum sind Python-Lambdas nützlich? [geschlossen]


Ich versuche herauszufinden, Python Lambdas. Ist Lambda einer jener "interessanten" Sprachartikel, die im wirklichen Leben vergessen werden sollten?

Ich bin mir sicher, dass es einige Grenzfälle gibt, in denen es nötig sein könnte, aber angesichts der Unklarheit dessen, das Potenzial, dass es in zukünftigen Versionen neu definiert wird (meine Annahme basiert auf den verschiedenen Definitionen davon) und die reduzierte Codierungsklarheit - sollte es Gemieden werden?

Das erinnert mich an einen Überlauf (Pufferüberlauf) von C-Typen, der auf die oberste Variable zeigt und die anderen Feldwerte überlädt. Es fühlt sich an wie ein Techie-Showmanship, aber ein Coder-Albtraum.


813
2018-05-20 20:40


Ursprung


Antworten:


Sprechen Sie darüber Lambda-Funktionen? Mögen

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

Diese Dinge sind tatsächlich ziemlich nützlich. Python unterstützt eine Art der Programmierung namens funktionale Programmierung wo Sie Funktionen an andere Funktionen übergeben können, um Dinge zu tun. Beispiel:

mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])

Sätze mult3 zu [3, 6, 9], jene Elemente der ursprünglichen Liste, die Vielfache von 3 sind. Dies ist kürzer (und man könnte argumentieren, klarer) als

def filterfunc(x):
    return x % 3 == 0
mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])

Natürlich könnten Sie in diesem speziellen Fall dasselbe wie ein Listenverständnis tun:

mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]

(oder sogar als range(3,10,3)), aber es gibt viele andere, ausgeklügeltere Anwendungsfälle, in denen Sie kein Listenverständnis verwenden können und eine Lambda-Funktion vielleicht der kürzeste Weg ist, etwas zu schreiben.

  • Rückgabe einer Funktion von einer anderen Funktion

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

    Dies wird oft verwendet, um Funktionswrapper zu erstellen, z. B. Pythons Dekoratoren.

  • Elemente einer iterierbaren Sequenz mit kombinieren 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'
    
  • Sortieren nach einem alternativen Schlüssel

    >>> 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]
    

Ich benutze Lambda-Funktionen regelmäßig. Es hat eine Weile gedauert, mich an sie zu gewöhnen, aber irgendwann habe ich verstanden, dass sie ein sehr wertvoller Teil der Sprache sind.


892
2018-05-20 20:52



lambda ist nur eine schicke Art zu sagen function. Abgesehen von seinem Namen gibt es nichts, das obskur, einschüchternd oder kryptisch ist. Wenn Sie die folgende Zeile lesen, ersetzen Sie sie lambda durch function in Deiner Vorstellung:

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

Es definiert nur eine Funktion von x. Einige andere Sprachen, wie R, sag es explizit:

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

Siehst du? Es ist eines der natürlichsten Dinge beim Programmieren.


322
2018-01-16 15:03



Die zweizeilige Zusammenfassung:

  1. Verschlüsse: Sehr hilfreich. Lerne sie, benutze sie, liebe sie.
  2. Pythons lambda Stichwort: unnötig, gelegentlich nützlich. Wenn Sie feststellen, dass Sie irgendetwas entfernt komplexes damit tun, legen Sie es weg und definieren Sie eine echte Funktion.

93
2018-05-20 22:37



Ein Lambda ist Teil eines sehr wichtigen Abstraktionsmechanismus, der sich mit Funktionen höherer Ordnung beschäftigt. Um das richtige Verständnis für seinen Wert zu bekommen, sehen Sie sich bitte hochwertige Lektionen an Abelson und Sussmanund lies das Buch SICP

Dies sind relevante Themen im modernen Softwaregeschäft und werden immer beliebter.


71
2018-05-20 20:49



Ich bezweifle, dass Lambda weggehen wird. Sehen Guidos Beitrag über den Versuch aufzuhören, es endgültig zu entfernen. Siehe auch ein Überblick über den Konflikt.

Sie können diesen Beitrag für mehr eine Geschichte über den Deal hinter Python-Funktionen lesen: http://python-history.blogspot.com/2009/04/origins-of-pythons-funktionelle-features.html

Kurioserweise wurden die Funktionen zum Zuordnen, Filtern und Reduzieren, die ursprünglich die Einführung von Lambda und anderen funktionalen Merkmalen motiviert hatten, zu einem großen Teil durch Listenerläuterungen und Generatorausdrücke ersetzt. Tatsächlich wurde die Reduce-Funktion aus der Liste der eingebauten Funktionen in Python 3.0 entfernt. (Es ist jedoch nicht notwendig, Beschwerden über die Entfernung von Lambda, Karte oder Filter zu senden: sie bleiben. :-)

Meine eigenen zwei Cent: Selten ist Lambda es wert, soweit es die Klarheit geht. Im Allgemeinen gibt es eine klarere Lösung, die Lambda nicht enthält.


57
2018-05-20 20:46



Lambdas sind extrem nützlich in der GUI-Programmierung. Angenommen, Sie erstellen eine Gruppe von Schaltflächen und möchten einen einzelnen parameterisierten Rückruf anstelle eines eindeutigen Rückrufs pro Schaltfläche verwenden. Mit Lambda können Sie das ganz einfach erreichen:

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

(Anmerkung: obwohl diese Frage spezifisch nachfragt lambdakannst du auch benutzen functools.partial um die gleiche Art von Ergebnis zu erhalten)

Die Alternative besteht darin, für jede Schaltfläche einen separaten Rückruf zu erstellen, der zu doppeltem Code führen kann.


56
2018-04-24 16:48



In Python, lambda ist nur eine Möglichkeit, Funktionen inline zu definieren,

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

und..

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

..sind die genau gleich.

Es gibt nichts, was man mit Lambda machen kann, was man mit einer regulären Funktion nicht tun kann - in Python-Funktionen ist ein Objekt genau wie alles andere, und Lambdas definieren einfach eine Funktion:

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

Ich denke ehrlich lambda Schlüsselwort ist in Python redundant - ich hatte nie die Notwendigkeit, sie zu verwenden (oder gesehen zu haben, wo eine reguläre Funktion, ein Listenverständnis oder eine der vielen eingebauten Funktionen besser hätte verwendet werden können)

Für ein völlig zufälliges Beispiel aus dem Artikel "Pythons Lambda ist kaputt!":

Um zu sehen, wie Lambda zerbrochen ist, erstellen Sie eine Liste von Funktionen fs=[f0,...,f9] woher fi(n)=i+n. Erster Versuch:

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

Ich würde argumentieren, auch wenn das funktionieren würde, es ist schrecklich und "unpythonisch", die gleiche Funktionalität könnte auf unzählige andere Arten geschrieben werden, zum Beispiel:

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

Ja, es ist nicht dasselbe, aber ich habe es noch nie habe eine Ursache gesehen, bei der das Erzeugen einer Gruppe von Lambda-Funktionen in einer Liste erforderlich war. Es könnte in anderen Sprachen sinnvoll sein, aber Python ist nicht Haskell (oder Lisp oder ...)

Bitte beachten Sie, dass wir Lambda verwenden können und immer noch das gewünschte erreichen   Ergebnisse auf diese Weise:

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

Bearbeiten:

Es gibt ein paar Fälle, in denen Lambda nützlich ist, zum Beispiel ist es oft praktisch, wenn Signale in PyQt-Anwendungen wie folgt verbunden werden:

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

Mach einfach w.textChanged.connect(dothing) würde anrufen dothing Methode mit einem Extra event Argument und verursachen einen Fehler. Mit den Lambda-Mitteln können wir das Argument sauber löschen, ohne eine Umbruchfunktion definieren zu müssen.


31
2018-05-21 02:03



Ich finde Lambda nützlich für eine Liste von Funktionen, die das gleiche tun, aber für verschiedene Umstände. Wie Mozilla Plural Regeln.

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'

Wenn Sie für alle eine Funktion definieren müssten, würden Sie am Ende verrückt werden. Auch wäre es nicht schön mit Funktionsnamen wie plural_rule_1, plural_rule_2usw. Und du müsstest eval() Wenn Sie auf eine variable Funktions-ID angewiesen sind.


28
2018-01-16 15:43



So ziemlich alles, was du damit machen kannst lambda Sie können entweder mit benannten Funktionen oder Listen- und Generatorausdrücken besser umgehen.

Folglich sollte man in den meisten Fällen nur eine davon verwenden (außer vielleicht für den im interaktiven Interpreter geschriebenen Scratch-Code).


26
2018-05-20 20:45



Ich benutze Python seit ein paar Jahren und ich bin nie in einen Fall gelaufen, in dem ich habe erforderlich Lambda. Wirklich, als der Anleitung Staaten, es ist nur für syntaktischen Zucker.


19
2018-05-20 20:47