这些Python表达式彼此等效吗?

这些Python表达式彼此等效吗?,python,ternary-operator,equivalent,Python,Ternary Operator,Equivalent,给定以下Python函数(忽略其缺点): 如果我将其改为: def adjust_year(year): return year - 2000 if year > 2000 else year - 1900 行为是等价的还是我以某种微妙的方式改变了它?它们确实是等价的,但条件表达式变化是首选的 您的表达式勉强避开了典型的和。。。或者中间表达式的计算结果为错误值(year>=2000年和-2000年或-1900年和year=2000将导致100)的陷阱。它们确实是等价的,但条件表达式变

给定以下Python函数(忽略其缺点):

如果我将其改为:

def adjust_year(year):
  return year - 2000 if year > 2000 else year - 1900

行为是等价的还是我以某种微妙的方式改变了它?

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


您的表达式勉强避开了典型的
和。。。或者中间表达式的计算结果为错误值(
year>=2000年和-2000年或-1900年
year=2000
将导致
100
)的陷阱。

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


您的表达式勉强避开了典型的
和。。。或者
中间表达式计算为错误值的陷阱(
year>=2000和year-2000或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之间的年份,这些函数确实是等效的(很容易看出,对于这个范围之外的输入,它们也是等效的)。

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

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

哪一个是“条件表达式”变体,第二个使用三值运算符?@WilliamKF:任何使用三个操作数的运算符都可以称为三值运算符。:-)它的正式名称是a,但是的,这就是我的意思。哪一个是“条件表达式”变体,第二个使用三值运算符?@WilliamKF:任何使用三个操作数的运算符都可以称为三值运算符。:-)它的正式名称是a,但是的,这就是我的意思。对你的答案投了赞成票,因为它展示了一种不同寻常的方法。真的很喜欢,罗夫。对你的答案投了赞成票,因为它展示了一种不同寻常的方法。我真的很喜欢。