Lisp的apply和funcall与Python的适用

时间:2010-10-04 15:57:32

标签: python lisp common-lisp python-2.x

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的应用之间是否存在更多差异?

5 个答案:

答案 0 :(得分:8)

  

有没有理由为什么Python选择名称apply not funcall?

因为它是Python,而不是LISP。不需要具有相同的名称,funcall是LISP命令,apply在Python中是不同的。

在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)

Just a note

  

自版本2.3以后不推荐使用:请使用*args**keywords的扩展调用语法。

在py3k中删除。

答案 3 :(得分:2)

我不明白为什么你声称Lisp的apply()会做与Python不同的事情。这两个函数都使用函数和列表,然后使用列表元素作为参数调用函数。 ((+ 1 2 3) 是对+的调用123,不是吗?)对我来说看起来两个apply都做同样的事情。

另一方面,

funcall传说一个函数和几个单独的参数(不是包含参数的列表),并将函数应用于这些参数。

答案 4 :(得分:1)

Lisp和Python的apply函数都做同样的事情 - 给定函数f和参数列表p,将f应用于p。唯一的区别是Python的apply也接受关键字参数的字典。在Lisp中,这些将作为:keyword参数包含在参数列表中。