【问题标题】:Expression evaluation mechanism of PythonPython的表达式求值机制
【发布时间】:2023-03-19 12:48:01
【问题描述】:

我曾经相信对于Python表达式f(g)(x),求值过程是:

  1. 求值f(g),返回函数h
  2. 评估h(x),返回最终结果。

但下面的代码表明这是不正确的:

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

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

那么 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

【问题讨论】:

  • 我不确定我是否理解这个问题。下面的代码如何表明这不是真的? double_or_zero(double) 返回一个带有参数 (h(x)) 的函数,并根据该参数 (x) 返回 double(x)-999...
  • @mgilson 如果 Python 解释器严格从左到右解析 double_or_zero(double)(3),它应该不知道下一部分 (3) 是什么,因为 3 不在当前评估范围内范围(double_or_zero(double))。
  • 如果评估顺序是从左到右,这种行为正是我所期望的。 f(g) 返回一个函数 h,它本身带有一个参数,在您的示例 3 或 -3 中,并根据符号给出相应的输出。它的工作方式与您在第 1 点和第 2 点中描述的完全一样。

标签: python expression evaluation


【解决方案1】:

为什么你认为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 函数的函数。碰巧这个函数是动态创建的,并通过调用另一个函数返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多