"exec"是Scheme的"apply"的Python对应物吗?



我找到了Python内置函数eval,但未能找到类似于Schemeapply的函数。

我已经详尽地检查了其他 Python 关键字,但没有一个与apply匹配。

候选人可能exec

In [14]: eval("print('testing')")      
testing
In [15]: exec("print('testing')")      
testing

和方案中:

> (eval '(display 'testing))
testing
> (apply display '(testing))
testing

Python的exec是Schemeapply的对应物吗?

No.Scheme 的apply用于将函数应用于存储在列表中的参数。Python这样做的方式是*,而不是exec

>>> args = [1, 2, 3]
>>> print(*args)
1 2 3

Python曾经有一个与Scheme的apply匹配的apply函数,但它被删除了,取而代之的是*符号。

在 Python 中定义 apply:

def apply(f, arg_list):
return f(*arg_list)

方案示例:

(define (pythagoras a b)
(sqrt (+ (* a a) (* b b))))
(apply pythagoras '(3 4))  ; Returns: 5

类似的 Python 示例:

import math
def pythagoras(a, b):
return math.sqrt(a**2 + b**2)
apply(pythagoras, [3, 4])  # Returns: 5.0

旁注(基于您对这些事情的明显兴趣(

Python的eval

eval('pythagoras(3, 4)')

而在方案中:

(eval '(pythagoras 3 4))
(eval "Hello")
(eval `(,(if (> x 0) + -) 100 ,(pythagoras 3 4)))

如您所见,Python 的eval要求您摆弄字符串、字节或"代码对象"。Scheme的eval采用Scheme。参见:同质性究竟是什么意思?

您可能有兴趣阅读有关元循环评估器的信息(来自计算机程序的结构和解释,第4章,元语言抽象(,以了解Scheme的evalapply的含义。

请注意,强烈建议不要在 Python 中使用eval(如果您确实需要使用它,请考虑ast.literal_eval(。在这两种语言中,如果您的问题可以使用其他方法解决,通常建议您避免eval

最新更新