以下是调用表达式mul(add(2, mul(4, 6)), add(3, 5))
的表达式树。
在下面的代码中,
from operator import mul
def square(x):
print('In square with value: ' + str(x))
return mul(x, x)
def repeat(f, n):
def identity(x):
return x
def apply_n_times(x):
return repeat(f,n-1)(f(x))
if n < 0:
raise ValueError("Cannot apply a function %d times" % (n))
elif n == 0:
return identity
else:
return apply_n_times
g = repeat(square, 2)(5)
print(g)
如果repeat(f, n-1)(f(x))
是一个函数,并且f
和n
是整数,我如何评估上述代码中的调用表达式x
。
答案 0 :(得分:1)
在Python中评估表达式from left to right:
在以下几行中,表达式将按其后缀的算术顺序进行评估:
expr1, expr2, expr3, expr4 (expr1, expr2, expr3, expr4) {expr1: expr2, expr3: expr4} expr1 + expr2 * (expr3 - expr4) expr1(expr2, expr3, *expr4, **expr5) expr3, expr4 = expr1, expr2
在这种情况下,这意味着return repeat(f, n-1)(f(x))
的工作原理如下:
tmp1 = repeat(f, n-1)
tmp2 = f(x)
return tmp1(tmp2)
...除了它没有创建那些额外的变量。
任何合理的实施都应该满足这些规则,而不仅仅是CPython。
答案 1 :(得分:0)
检查此问题的一种简单方法是使用全局变量。
tester = 0
def test_1():
global tester
print(tester, "from test_1")
tester = 1
return lambda x: None
def test_2():
global tester
print(tester, "from test_2")
tester = 2
return None
test_1()(test_2())
并打印:
0 from test_1
1 from test_2
在python 3中(以及2中的等价物)与来自python.org的编译器,所以它似乎从左到右。
您可能必须使用编译器对其进行测试才能获得结果,因为它取决于编译器。