2013-02-14 34 views
0

考虑下面的Python函数(忽略它的缺点):这些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

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

你的表达狭避免了典型and ... or陷阱其中中间表达式计算为一个值falsy(year >= 2000 and year - 2000 or year - 1900year = 2000将导致100)。

+0

哪一个是“条件表达式”变体,第二个使用三元运算符? – WilliamKF 2013-02-14 19:20:12

+1

@WilliamKF:*任何带三个操作数的操作符都可以称为三元操作符。 :-)它正式被称为[条件表达式](http://docs.python.org/2/reference/expressions.html#conditional-expressions),但是,是的,这就是我的意思。 – 2013-02-14 20:09:19

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

+0

ROFL。 upvoted你的答案,它展示了一个不寻常的方法。真的很喜欢它。 – Ellioh 2013-02-14 19:49:26

相关问题