这些Python表达式是否彼此等效?

时间:2013-02-14 19:12:56

标签: python ternary-operator equivalent

给出以下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

行为是否相同或者我是否以某种微妙的方式改变了它?

2 个答案:

答案 0 :(得分:2)

它们确实是等价的,但首选条件表达式变体。

你的表达式几乎避免了典型的and ... or陷阱,其中中间表达式评估为假值(year >= 2000 and year - 2000 or year - 1900year = 2000将导致100)。

答案 1 :(得分:1)

有几种方法可以解决这个问题。一个是逻辑分析两个版本;另一种是使用蛮力并比较每个有效输入的结果:

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之间确实相当多年(很容易看出它们对于超出此范围的输入也是等效的。)