2 Stimmen

Lisp's apply und funcall vs. Python's apply

Lisp's APPLY ist für den Aufruf von Funktionen mit berechneten Argumenten, die in Listen gespeichert sind.(Abgeändert von Rainers Kommentar)

Der folgende Code ändert zum Beispiel (list 1 2 3) in (+ 1 2 3).

(apply #'+ '(1 2 3)) 

Pythons apply tut jedoch das, was Lisp's funcall tut, abgesehen von einigen kleinen Unterschieden (Eingabe wird als Tupel/Liste angegeben)

(defun add (x y) (+ x y))
(funcall #'add 1 2) 
or
(funcall #'(lambda (x y) (+ x y)) 10 2)
    apply(lambda x,y : x+y, \[1,2\])

Was meinen Sie dazu? Gibt es weitere Unterschiede zwischen Lisp's funcall und Python's apply?

2 Stimmen

Beachten Sie, dass Sie auch Folgendes tun können operator.add(*[1,2]) anstelle von 1+2 . Viel Vernebelung?

5 Stimmen

Nein, Lisp's APPLY ist nicht dazu da, das erste Element in einer Liste zu ersetzen. Lisp's APPLY ist für den Aufruf von Funktionen mit berechneten Argumentlisten, die in Listen gespeichert sind.

8voto

leoluk Punkte 11849

Gibt es einen Grund, warum Python den Namen apply und nicht funcall gewählt hat?

Weil es Python und nicht LISP ist. Es ist nicht nötig, den gleichen Namen zu haben, funcall ist ein LISP-Befehl und apply ist in Python etwas anderes.

apply ist in Python veraltet, verwenden Sie die erweiterte Aufrufsyntax.

Alte Syntax:

apply(foo, args, kwargs)

Neue Syntax:

foo(*args, **kwargs)

4voto

Vatine Punkte 19955

In Common Lisp (funcall #'fun 1 (list 2 3 4)) ist genau dasselbe wie (fun 1 (list 2 3 4)) in der Erwägung, dass (apply #'fun 1 (list 2 3 4)) würde je nach der Arität des Spaßes unterschiedliche Dinge bedeuten.

* (defun bleargh (a &rest b) (cons a b))

BLEARGH
* (funcall #'bleargh 1 (list 1 2 3))

(1 (1 2 3))
* (apply  #'bleargh 1 (list 1 2 3))

(1 1 2 3)

FUNCALL und APPLY tun also sozusagen sehr unterschiedliche Dinge.

2voto

SilentGhost Punkte 285785

Nur eine Anmerkung :

Veraltet seit Version 2.3 : Verwenden Sie die erweiterte Aufrufsyntax mit *args y **keywords stattdessen.

in py3k entfernt.

2voto

sth Punkte 210180

Ich verstehe nicht, warum Sie behaupten, dass Lisp's apply() etwas anderes tun würde als Python. Beide Funktionen nehmen eine Funktion und eine Liste und rufen dann die Funktion mit den Listenelementen als Argumente auf. ( (+ 1 2 3) es einen Aufruf an + mit Argumenten 1 , 2 y 3 nicht wahr?) Für mich sieht es aus wie beides apply s tun genau das Gleiche.

funcall hingegen erzählt eine Funktion und mehrere separate Argumente (keine Liste mit Argumenten) und wendet die Funktion auf diese Argumente an.

1voto

Nathan Davis Punkte 5198

Sowohl die Lisp- als auch die Python-Funktion apply tun dasselbe - bei einer Funktion f und einer Liste von Parametern p wird f auf p angewendet. Der einzige Unterschied ist, dass Pythons apply auch ein Wörterbuch für Schlüsselwortargumente akzeptiert. In Lisp würden diese in die Parameterliste aufgenommen werden als :keyword Argumente.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X