2016-05-27 13 views
3

Wenn ich Dokumente oder Beispiele lese, sehe ich oft die Idee, dass man einer Variablen eine anonyme Funktion zuweisen kann. Warum sollte ich das eigentlich tun, anstatt nur eine neue Funktion zu definieren?Warum sollte ich einer Variablen eine anonyme Funktion zuweisen?

Einige Beispiele:

Clojure/Lisp

(def add2 
    (fn [a] (+ 2 a)) 
(add2 4) ;; => 6 

Python

add2 = lambda e: e + 2 
add2(3) # => 5 

Scala

val add2 = (x: Int) => x + 2 
add2(5) /* => 7 */ 

Offensichtlich sind diese triviale Beispiele, aber in der Produktion Code, ich denke, in der Regel von einer anonymen Funktion eine one off Funktion sein, die ich für einen bestimmten Anwendungsfall müssen (man denke höher kinded Typen und dergleichen).

Kann jemand erklären, warum ich einer Variablen eine anonyme Funktion zuweisen würde? Ist es eine Laufzeit-/Kompilierzeit-Sache? Gibt es bestimmte Leistungsmerkmale, die das günstig machen?

+0

Dies ist in erster Linie auf der Grundlage von Meinungen/Stil. Aber die Verwendung von Lambdas wie in ** Python ** hat keinen anderen "Zweck", als das Debugging zu erschweren. –

+1

Ich gebe manchmal einer Lambda-Funktion einen Namen, wenn ich eine 'key'-Funktion brauche (zB für' sort') und wenn ich die Funktion in der gleichen Zeile definiere, in der ich sie als Argument verwende, fühle ich mich zu kurz, definiere aber ein die normale Funktion fühlt sich zu sehr an. – timgeb

+0

Ich habe das heute Morgen getan. Ich habe 2 höherwertige Funktionen getestet, die verschiedene Implementierungen hatten, aber identische Ein-/Ausgaben haben sollten. Ich band die übergebene Funktion in ein "Let" und benutzte sie dann im Body. Ich hätte es als eine konkrete Funktion definieren können, aber das war ausreichend für einen schnellen Test. – Carcigenicate

Antwort

1

denke ich so, wie es präsentiert wird mehr so ​​ist der Leser versteht wirklich, dass die Funktionen der ersten Klasse in sind die Sprachen. Hätten sie sie nur als Argumente für andere Funktionen benutzt, wäre der Punkt vielleicht verloren. Aber wenn man sie auf eine sehr wertähnliche Weise benutzt, wie die rechte Hand einer Zuweisung, oder eine Methode auf dem Lambda selbst anruft usw., wird der Punkt, dass diese Zahlen, Strings, Karten oder jedem anderen Wert in der Sprache sehr ähnlich sind, nach Hause getragen.

Persönlich verwende ich dieses Muster nicht, weil, wie andere Kommentare erwähnt haben, macht es Code schwieriger zu lesen und zu debuggen, sowie in einigen Fällen nicht die volle Leistung der richtigen Funktionsdeklaration (Python).

Wenn man jedoch Code schreibt, der tatsächlich Funktionsargumente verwendet, tut man mehr oder weniger genau das. Nur die Zuweisung erfolgt indirekter als die Verwendung des Operators.

1

Nach dem Python Docs:

Semantisch sind sie nur syntaktischer Zucker für eine normale Funktionsdefinition.

afaik, gibt es keine speziellen Leistungsmerkmale für lambda, die es vorteilhaft macht. Wenn Sie daran denken, Lambdas für komplexe Aufgaben zu verwenden, denken Sie noch einmal nach, verwenden Sie Funktionen.

Verwenden Sie immer eine Def-Anweisung anstelle einer Zuweisungsanweisung, die einen Lambda-Ausdruck direkt an einen Bezeichner bindet.

bearbeiten: Added StefanS‘Vorschlag

+1

Sie sollten "Immer eine def-Anweisung anstelle einer Zuweisungsanweisung, die einen Lambda-Ausdruck direkt an einen Bezeichner bindet" hinzufügen: https://www.python.org/dev/peps/pep-0008/. Die tatsächliche Verwendung von Lambda-Funktionen ist, dass Sie kleine Funktionen in anderen Dingen wie Listen-Comprehensions oder Map/Filter verwenden können, wie die Beispiele in http://docs.python-guide.org/en/latest/writing/style/#short -ways-to-manipulate-Listen. – StefanS

+0

@STefanS Ok, werde das hinzufügen :) – noteness

0

In Clojure, ist der Grund, so können Sie die Funktion in mehr als einem Ort verwenden. In der Tat

(defn add2 [x] (+ x 2) 

ist nur eine Abkürzung für

(def add2 (fn [x] (+ x 2)) 
Verwandte Themen