Wie sind Lambdas nützlich? [closed]

Lesezeit: 10 Minuten

Benutzer-Avatar
Meade

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

    – Felder

    3. Oktober 2016 um 13:58 Uhr

  • Warum Lambda-Funktionen verwenden?

    – phuklv

    21. November 2017 um 11:33 Uhr

Benutzer-Avatar
David z

Redest du von Lambda-Ausdrücke? Wie

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

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:

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

setzt 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 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()

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

  1. Schließungen: Sehr hilfreich. Lernen Sie sie, verwenden Sie sie, lieben Sie sie.
  2. 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 das a: 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.

Benutzer-Avatar
rhetg

Ich bezweifle, dass Lambda weggeht. Sehen Guidos Beitrag darüber, endlich aufzugeben, es zu entfernen. Siehe auch ein Umriss des Konflikts.

Sie können sich diesen Beitrag ansehen, um mehr über die Geschichte über den Deal hinter den Funktionsmerkmalen von Python zu erfahren:
http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

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

Benutzer-Avatar
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)

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

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

1145090cookie-checkWie sind Lambdas nützlich? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy