考虑下面的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
将行为等同或有我在一些微妙的方式改变了吗?
考虑下面的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
将行为等同或有我在一些微妙的方式改变了吗?
它们确实是等价的,但条件表达式的变化是首选。
你的表达狭避免了典型and ... or
陷阱其中中间表达式计算为一个值falsy(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年之间(很容易看到,它们对于超出此范围的输入也是等效的)。
ROFL。 upvoted你的答案,它展示了一个不寻常的方法。真的很喜欢它。 – Ellioh 2013-02-14 19:49:26
哪一个是“条件表达式”变体,第二个使用三元运算符? – WilliamKF 2013-02-14 19:20:12
@WilliamKF:*任何带三个操作数的操作符都可以称为三元操作符。 :-)它正式被称为[条件表达式](http://docs.python.org/2/reference/expressions.html#conditional-expressions),但是,是的,这就是我的意思。 – 2013-02-14 20:09:19