【问题标题】:Are these Python expressions equivalent to each other?这些 Python 表达式是否彼此等价?
【发布时间】:2013-02-14 19:12:56
【问题描述】:

给定以下 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 ternary-operator equivalent


    【解决方案1】:

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

    您的表达式勉强避免了典型的 and ... or 陷阱,即中间表达式的计算结果为假值(year >= 2000 and year - 2000 or year - 1900year = 2000 将导致 100)。

    【讨论】:

    • 哪个是'条件表达式'变体,第二个使用三元运算符?
    • @WilliamKF: any 运算符,只要有三个操作数就可以称为三元运算符。 :-) 它的官方名称是conditional expression,但是是的,这就是我的意思。
    【解决方案2】:

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

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

    【讨论】:

    • ROFL。赞成你的答案,因为它展示了一种不寻常的方法。真的很喜欢。
    猜你喜欢
    • 2012-11-30
    • 2017-09-07
    • 2011-09-08
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    相关资源
    最近更新 更多