Python的表达式评估机制

时间:2016-07-08 00:46:25

标签: python expression evaluation

我曾经相信Python表达式f(g)(x),评估过程是:

  1. 评估f(g),返回函数h;
  2. 评估h(x),返回最终结果。
  3. 但是下面的代码显示这不是真的:

    def double(x):
        return 2 * x
    
    def double_or_zero(f):
        def f_or_zero(x):
            if x > 0:
                return f(x)
            else:
                return -999
        return f_or_zero
    
    print(double_or_zero(double)(3))
    print(double_or_zero(double)(-3))
    

    第一个部分(如果存在)double_or_zero(double)被评估时,它可以“看到”<中的参数(3-3) em> next 步骤, 这表明从左到右的评估模型不正确。

    那么Python(2.x和3.x)的表达式评估机制是什么?

    更新

    感谢Bi Rico的回答,Python严格评估从左到右的表达。希望下面的代码可以更清晰:

    def double(x):
        return 2 * x
    
    def f_or_zero(this_f):
        def this_f_or_zero(x):
            print('I am running with x = %s' % x)
            if x > 0:
                return this_f(x)
            else:
                return -999
        print('I am created: %s' % this_f_or_zero)
        return this_f_or_zero
    
    double_or_zero = f_or_zero(double)
    print(double_or_zero(3))
    print(double_or_zero(-3))
    

    运行它:

    $ python demo.py
    I am created: <function this_f_or_zero at 0x7f9f53786500>
    I am running with x = 3
    6
    I am running with x = -3
    -999
    

1 个答案:

答案 0 :(得分:3)

为什么你认为python可以在第一部分被评估时看到参数,但它不能。这个例子可能会使发生的事情变得更加清晰。您的示例以相同的方式工作。

def double(x):
    return 2 * x

def f_or_zero(this_f):
    def this_f_or_zero(x):
        if x > 0:
            return this_f(x)
        else:
            return 0
    return this_f_or_zero


double_or_zero = f_or_zero(double)
print(double_or_zero(3))
print(double_or_zero(-3))

double_or_zero是一个函数,其行为(大部分)与任何其他python函数一样。事实上,这个函数是动态创建的,并且通过调用另一个函数返回。