Lisp的APPLY用于调用存储在列表中的带有计算参数的函数。(从Rainer的注释中修改)
例如,以下代码更改(列表1 2 3)到(+ 1 2 3)。
(apply #'+ '(1 2 3))
然而,Python的应用做了Lisp的funcall所做的事情,除了一些细微的差别(输入是作为元组/列表给出的)
(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])你怎么看? Lisp的funcall和Python的应用之间是否存在更多差异?
答案 0 :(得分:8)
有没有理由为什么Python选择名称apply not funcall?
因为它是Python,而不是LISP。不需要具有相同的名称,funcall
是LISP命令,apply
在Python中是不同的。
apply
,使用扩展调用语法。
旧语法:
apply(foo, args, kwargs)
新语法:
foo(*args, **kwargs)
答案 1 :(得分:4)
在Common Lisp中(funcall #'fun 1 (list 2 3 4))
与(fun 1 (list 2 3 4))
完全相同,而(apply #'fun 1 (list 2 3 4))
则意味着不同的东西,具体取决于乐趣的方式。
* (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和APPLY会做很多不同的事情。
答案 2 :(得分:2)
答案 3 :(得分:2)
我不明白为什么你声称Lisp的apply()
会做与Python不同的事情。这两个函数都使用函数和列表,然后使用列表元素作为参数调用函数。 ((+ 1 2 3)
是对+
的调用1
,2
和3
,不是吗?)对我来说看起来两个apply
都做同样的事情。
funcall
传说一个函数和几个单独的参数(不是包含参数的列表),并将函数应用于这些参数。
答案 4 :(得分:1)
Lisp和Python的apply函数都做同样的事情 - 给定函数f和参数列表p,将f应用于p。唯一的区别是Python的apply也接受关键字参数的字典。在Lisp中,这些将作为:keyword
参数包含在参数列表中。