给定以下 Python 函数(忽略其缺点):
def adjust_year(year):
return year > 2000 and year - 2000 or year - 1900
如果我将其更改为:
def adjust_year(year):
return year - 2000 if year > 2000 else year - 1900
行为是等效的还是我以某种微妙的方式改变了它?
给定以下 Python 函数(忽略其缺点):
def adjust_year(year):
return year > 2000 and year - 2000 or year - 1900
如果我将其更改为:
def adjust_year(year):
return year - 2000 if year > 2000 else year - 1900
行为是等效的还是我以某种微妙的方式改变了它?
它们确实是等价的,但首选条件表达式变化。
您的表达式勉强避免了and ... or
中间表达式计算为假值(year >= 2000 and year - 2000 or year - 1900
并将year = 2000
导致100
)的典型陷阱。
有几种方法可以解决这个问题。一是对两个版本进行逻辑分析;另一种是使用蛮力并比较每个有效输入的结果:
def adjust_year_1(year):
return year > 2000 and year - 2000 or year - 1900
def adjust_year_2(year):
return year - 2000 if year > 2000 else year - 1900
for y in range(-4000, 4000):
if adjust_year_1(y) != adjust_year_2(y):
print y, adjust_year_1(y), adjust_year_2(y)
这不会打印任何内容,表明这些函数在 -4000 和 4000 之间的年份确实是等效的(很容易看出它们对于超出此范围的输入也是等效的)。