Ich versuche, Python-Lambdas herauszufinden. Ist lambda eines dieser “interessanten” Sprachelemente, die man im wirklichen Leben vergessen sollte?
Ich bin mir sicher, dass es einige Grenzfälle gibt, in denen dies erforderlich sein könnte, aber angesichts der Unklarheit, des Potenzials, dass es in zukünftigen Versionen neu definiert wird (meine Annahme basiert auf den verschiedenen Definitionen davon) und der reduzierten Codierungsklarheit – sollte es so sein Gemieden werden?
Dies erinnert mich an das Überlaufen (Pufferüberlauf) von C-Typen – auf die oberste Variable zeigen und überladen, um die anderen Feldwerte festzulegen. Es fühlt sich an wie eine Art Techie-Showmanier, aber ein Alptraum für Wartungscoder.
+1 Gute Frage – schlechte Annahmen (Unklarheit von Lambda) =) Versuchen Sie, Programmiertechniken nicht zu beurteilen. Werten Sie sie aus und fügen Sie sie Ihrem mentalen Werkzeugkasten hinzu. Wenn Sie sie nicht mögen, verwenden Sie sie nicht und seien Sie bereit, sie logisch zu diskutieren, ohne religiös zu werden.
– Kieveli
23. Februar 2010 um 13:27 Uhr
Haskell-Regeln! Lambda-Funktionen verleihen Ihnen Ausdruckskraft und Abstraktionskraft.
– Jonathan Barbero
23. Februar 2010 um 13:31 Uhr
@JAL Ganz zu schweigen von LISP …
– Annäherung an DarknessFish
24. Februar 2014 um 0:41 Uhr
@ApproachingDarknessFish “Ah, das ist die Klammer deines Vaters. Eine zivilisiertere Waffe aus einem zivilisierteren Zeitalter.” – Obi Lisp Kenobi
Die Dinger sind eigentlich ganz brauchbar. Python unterstützt einen Programmierstil namens Funktionale Programmierung wo Sie Funktionen an andere Funktionen übergeben können, um Dinge zu tun. Beispiel:
Natürlich könnten Sie in diesem speziellen Fall dasselbe tun wie ein Listenverständnis:
mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]
(oder auch als range(3,10,3)), aber es gibt viele andere, anspruchsvollere Anwendungsfälle, in denen Sie kein Listenverständnis verwenden können und eine Lambda-Funktion möglicherweise der kürzeste Weg ist, etwas zu schreiben.
Zurückgeben einer Funktion von einer anderen Funktion
>>> def transform(n):
... return lambda x: x + n
...
>>> f = transform(3)
>>> f(4)
7
Dies wird häufig verwendet, um Funktionswrapper zu erstellen, wie z. B. die Decorators von Python.
Kombinieren von Elementen einer iterierbaren Sequenz mit reduce()
Ich verwende Lambda-Funktionen regelmäßig. Ich brauchte eine Weile, um mich an sie zu gewöhnen, aber schließlich verstand ich, dass sie ein sehr wertvoller Teil der Sprache sind.
Ich liebe die Beispiele, sehr leicht zu verstehen. Aber für den reduzierten Teil. Wenn ich diese Funktion implementieren muss. Ich würde es tun ','.join(str(x) for x in [1,2,3,4,5,6,7,8,9])
– etlds
30. August 2016 um 20:09 Uhr
Übrigens, wenn Sie dies auf Python3 ausführen, müssen Sie die Liste der Filterergebnisse aufrufen, um die tatsächlichen Werte zu sehen, außerdem müssen Sie Reduce aus Functools importieren
– Gerhard
20. Oktober 2016 um 7:53 Uhr
Sind wir uns der obigen Definition von „funktionaler Programmierung“ sicher? Es kam mir etwas verwirrend vor.
– stdout
6. Februar 2017 um 22:53 Uhr
Ich denke, der entscheidende Punkt ist das lambda Funktionen können anonym sein (wie in allen Ihren Beispielen). Wenn Sie a zuweisen lambda Funktion zu irgendetwas, dann machst du es falsch und solltest es verwenden def stattdessen
– Chris_Rands
8. Dezember 2017 um 14:23 Uhr
@zgulser Es ist keine Definition, es ist nur eine Aussage über etwas, das Ihnen die funktionale Programmierung ermöglicht.
– David Z
8. Dezember 2017 um 22:22 Uhr
lambda ist nur eine schicke Art zu sagen function. Abgesehen von seinem Namen ist an ihm nichts obskur, einschüchternd oder kryptisch. Wenn Sie die folgende Zeile lesen, ersetzen 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 Rsagen Sie es ausdrücklich:
> f = function(x) { x + 1 }
> f(3)
4
Siehst du? Es ist eines der natürlichsten Dinge beim Programmieren.
Dies ist eine großartige Beschreibung für diejenigen, die aus einem nicht-programmierenden Hintergrund kommen (dh: exakte Wissenschaften), was die Bedeutung von ausmacht lambda sehr einfach zu verstehen. Vielen Dank!
– Gabriel
2. Januar 2016 um 15:24 Uhr
Raymond Hettinger beklagte den Namen in einem seiner Vorträge und sagte, dass alle Verwirrung hätte vermieden werden können, wenn man ihn „make function“ statt „lambda“ genannt hätte. 🙂
– ankush981
7. Juli 2016 um 15:42 Uhr
ersetzen lambda durch function in Deiner Vorstellung und hinzufügen return vor dem letzten Ausdruck
– Ciprian Tomoiagă
28. Januar 2017 um 20:57 Uhr
@AaronMcMillin Versuchen Sie es type(lambda x: 3). lambda Ausdrücke und def Aussagen beide erzeugen function Gegenstände; es ist nur die Syntax von a lambda Ausdruck, der begrenzt die Instanzen, die es hervorbringen kann.
– chepner
8. Juni 2018 um 0:48 Uhr
@AaronMcMillin Du verfehlst meinen Standpunkt. Nur weil du es nicht definieren kannst jeder Funktion mit a lambda Ausdruck bedeutet nicht das Ergebnis von a lambda Ausdruck ist nicht eine Funktion.
– chepner
8. Juni 2018 um 13:32 Uhr
Die zweizeilige Zusammenfassung:
Schließungen: Sehr hilfreich. Lernen Sie sie, verwenden Sie sie, lieben Sie sie.
Pythons lambda Stichwort: unnötig, gelegentlich nützlich. Wenn Sie feststellen, dass Sie irgendetwas entfernt Komplexes damit machen, legen Sie es weg und definieren Sie eine echte Funktion.
Für diejenigen, die durch die gegebene Definition von Closures verwirrt sind, hier eine Erklärung eines Laien: Closures sind, wenn Sie definieren etwas der Variablen einer Funktion bei Laufzeit, aber Vor es heißt. Für ein Python-Beispiel: a = int(input("Enter a number:\n> ")); add=(lambda x: a+x); b = int(input("Enter another number:\n> ")); print("The sum of these numbers is", add(b)) – in diesem Fall, f wäre ein Schließung Über a. Es erfasst es und gibt seinen Operanden plus zurück dasa: auch wenn Sie es in einem Bereich verwenden, wo a anders oder undefiniert ist (z. B. wenn Sie es getan haben import f from this_comment)!
– JamesTheAwesomeDude
3. April 2021 um 21:13 Uhr
Ein Lambda ist Teil eines sehr wichtigen Abstraktionsmechanismus, der sich mit Funktionen höherer Ordnung befasst. Um seinen Wert richtig zu verstehen, sehen Sie sich bitte qualitativ hochwertige Lektionen an Abelson und Sussmannund lies das Buch SICP
Dies sind relevante Themen im modernen Softwaregeschäft, die immer beliebter werden.
Seltsamerweise wurden die Map-, Filter- und Reduce-Funktionen, die ursprünglich die Einführung von Lambda und anderen Funktionsmerkmalen motivierten, weitgehend durch List Comprehensions und Generator-Ausdrücke ersetzt. Tatsächlich wurde die Reduce-Funktion aus der Liste der integrierten Funktionen in Python 3.0 entfernt. (Es ist jedoch nicht erforderlich, Beschwerden über die Entfernung von Lambda, Karte oder Filter einzureichen: Sie bleiben. 🙂
Meine eigenen zwei Cent: Lambda ist es selten wert, was die Klarheit angeht. Im Allgemeinen gibt es eine klarere Lösung, die kein Lambda enthält.
Beachten Sie, dass Reduce immer noch in Python 3.0 importiert werden kann. Wenn Sie es WIRKLICH wollen, können Sie es immer noch haben.
– Pawel Polewicz
20. Mai 2009 um 22:00 Uhr
Lambdas sind äußerst nützlich bei der GUI-Programmierung. Angenommen, Sie erstellen eine Gruppe von Schaltflächen und möchten einen einzelnen parametrisierten Callback anstelle eines eindeutigen Callbacks 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()
(Hinweis: Obwohl diese Frage speziell danach fragt lambdakönnen Sie auch verwenden 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, was zu doppeltem Code führen kann.
Beachten Sie, dass Reduce immer noch in Python 3.0 importiert werden kann. Wenn Sie es WIRKLICH wollen, können Sie es immer noch haben.
– Pawel Polewicz
20. Mai 2009 um 22:00 Uhr
Michael
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 Sie mit Lambda tun können, was Sie nicht mit einer regulären Funktion tun könnten – in Python sind Funktionen ein Objekt wie alles andere, und Lambdas definieren einfach eine Funktion:
>>> a = lambda x: x + 1
>>> type(a)
<type 'function'>
Ich denke ehrlich gesagt lambda Schlüsselwort ist in Python überflüssig – ich hatte nie die Notwendigkeit, sie zu verwenden (oder gesehen, dass eine verwendet wurde, wo eine reguläre Funktion, ein Listenverständnis oder eine der vielen eingebauten Funktionen besser hätte verwendet werden können)
Um zu sehen, wie Lambda kaputt geht, versuchen Sie, eine Liste von Funktionen zu generieren fs=[f0,...,f9] wo fi(n)=i+n. Erster Versuch:
>>> fs = [(lambda n: i + n) for i in range(10)]
>>> fs[3](4)
13
Ich würde argumentieren, selbst wenn das funktionieren würde, es ist schrecklich und “unpythonisch”, dieselbe 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 noch nie eine Ursache gesehen, bei der das Generieren einer Gruppe von Lambda-Funktionen in einer Liste erforderlich war. Es mag in anderen Sprachen sinnvoll sein, aber Python ist nicht Haskell (oder Lisp oder …)
Bitte beachten Sie, dass wir Lambda verwenden und auf diese Weise dennoch die gewünschten Ergebnisse erzielen können:
>>> fs = [(lambda n,i=i: i + n) for i in range(10)]
>>> fs[3](4)
7
Bearbeiten:
Es gibt einige 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 die nennen dothing Methode mit einem Extra event argumentieren und einen Fehler verursachen. Die Verwendung des Lambda bedeutet, dass wir das Argument ordentlich löschen können, ohne eine Wrapping-Funktion definieren zu müssen.
Ihr Argument “Lambda ist kaputt” ist kaputt, weil die Scoping-Regeln für Python-Variablen auf diese Weise funktionieren, Punkt. Sie werden auf die gleiche Weise gebissen, wenn Sie innerhalb der for-Schleife einen Abschluss erstellt haben.
– Antti Haapala – Слава Україні
27. Februar 2013 um 7:24 Uhr
Lambda ist nur Pythons Art, dem Benutzer eine “anonyme” Funktion bereitzustellen, wie es viele andere Sprachen haben (z. B. Javascript).
– Stefan Grünwald
31. Oktober 2014 um 19:27 Uhr
Das Lambda und die Funktion aist, dass Sie nicht definiert sind exakt gleich. 🙂 Sie unterscheiden sich durch __name__ Feld zumindest…
– mike3996
6. November 2014 um 7:55 Uhr
Es funktioniert mehr als nur eine Inline-Funktion.
– kt
28. November 2015 um 12:23 Uhr
Ihre Argumentation zu “möglicherweise in einer anderen Sprache sinnvoll” ist seltsam. Entweder gibt es intrinsische Eigenschaften von Lambdas oder nicht.
– Tito
2. Februar 2017 um 15:12 Uhr
11450900cookie-checkWie sind Lambdas nützlich? [closed]yes
+1 Gute Frage – schlechte Annahmen (Unklarheit von Lambda) =) Versuchen Sie, Programmiertechniken nicht zu beurteilen. Werten Sie sie aus und fügen Sie sie Ihrem mentalen Werkzeugkasten hinzu. Wenn Sie sie nicht mögen, verwenden Sie sie nicht und seien Sie bereit, sie logisch zu diskutieren, ohne religiös zu werden.
– Kieveli
23. Februar 2010 um 13:27 Uhr
Haskell-Regeln! Lambda-Funktionen verleihen Ihnen Ausdruckskraft und Abstraktionskraft.
– Jonathan Barbero
23. Februar 2010 um 13:31 Uhr
@JAL Ganz zu schweigen von LISP …
– Annäherung an DarknessFish
24. Februar 2014 um 0:41 Uhr
@ApproachingDarknessFish “Ah, das ist die Klammer deines Vaters. Eine zivilisiertere Waffe aus einem zivilisierteren Zeitalter.” – Obi Lisp Kenobi
– Felder
3. Oktober 2016 um 13:58 Uhr
Warum Lambda-Funktionen verwenden?
– phuklv
21. November 2017 um 11:33 Uhr