Python 的表达式求值机制
Expression evaluation mechanism of Python
我曾经相信Python表达式f(g)(x)
,求值过程是:
- 计算
f(g)
、return 函数 h
;
- 评价
h(x)
,return最终结果。
但下面的代码表明这不是真的:
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)
求值时,它可以"see"参数(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
为什么你认为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 函数的函数。恰好这个函数是动态创建的,并通过调用另一个函数返回。
我曾经相信Python表达式f(g)(x)
,求值过程是:
- 计算
f(g)
、return 函数h
; - 评价
h(x)
,return最终结果。
但下面的代码表明这不是真的:
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)
求值时,它可以"see"参数(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
为什么你认为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 函数的函数。恰好这个函数是动态创建的,并通过调用另一个函数返回。