【发布时间】:2023-03-19 12:48:01
【问题描述】:
我曾经相信对于Python表达式f(g)(x),求值过程是:
- 求值
f(g),返回函数h; - 评估
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