评估呼叫表达

时间:2015-05-16 12:25:25

标签: python-3.x

以下是调用表达式mul(add(2, mul(4, 6)), add(3, 5))的表达式树。

enter image description here

在下面的代码中,

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))是一个函数,并且fn是整数,我如何评估上述代码中的调用表达式x

2 个答案:

答案 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的编译器,所以它似乎从左到右。

您可能必须使用编译器对其进行测试才能获得结果,因为它取决于编译器。