我正在使用Python进行一些CodingBat练习,直到我偶然发现了我提出的解决方案的问题。
练习的链接是here
我尝试使用此代码解决它:
def alarm_clock(day, vacation):
if vacation and day == 0 or day == 6:
return "off"
elif vacation and day != 0 and day != 6:
return "10:00"
if vacation == False and day == 0 or day == 6:
return "10:00"
elif vacation == False and day != 0 or day != 6:
return "7:00"
当天是6并且假期为假时,它会返回“关闭”而不是“10:00”。你能在这里分享一些亮点吗?是否有一个前If语句评估为“10:00”值?
答案 0 :(得分:3)
其他人已经指出了逻辑运算符的优先级。也许你可能会考虑像这样重构你的条件(恕我直言的决策树反映得更好):
if vacation:
if day == 0 or day == 6: #or if day in (0, 6)
return "off"
else:
return "10:00"
else:
if day == 0 or day == 6: #or if day in (0, 6)
return "10:00"
else:
return "7:00"
阐述dimo414的评论:
weekend = day in (0, 6)
if vacation:
if weekend:
return "off"
else:
return "10:00"
else:
if weekend:
return "10:00"
else:
return "7:00"
甚至:
weekend = day in (0, 6)
if vacation:
return "off" if weekend else "10:00"
else:
return "10:00" if weekend else "7:00"
答案 1 :(得分:2)
vacation and day == 0 or day == 6
评估类似
(vacation and day == 0) or day == 6
所以,如果你的then子句day == 6
得到评估。
您可能需要
vacation and (day == 0 or day == 6)
答案 2 :(得分:0)
逻辑or
的优先级低于Python中and
的优先级
所以在这里
if vacation and day == 0 or day == 6:
只要day == 6
,整个陈述就是真的。
所以正确的是
if vacation and (day == 0 or day == 6):
答案 3 :(得分:0)
and
优先于 or
。
所以改变:
if vacation and day == 0 or day == 6:
带
if vacation and (day == 0 or day == 6):
或更好,更像英语:
if vacation and day in [0, 6]:
所以我觉得它看起来更具可读性
weekend = [0, 6]
def alarm_clock(day, vacation):
if vacation:
return day in weekend and "off" or "10:00"
else:
return day in weekend and "10:00" or "7:00"
答案 4 :(得分:0)
我认为这里最明确的解决方案是命名您的中间值:
weekend = day == 0 or day == 6
现在,您是否按原样保留结构:
def alarm_clock(day, vacation):
if vacation and weekend:
return "off"
elif vacation and weekday:
return "10:00"
elif not vacation and weekend:
return "10:00"
elif not vacation and not weekend:
return "7:00"
...或将其重构为嵌套的if
语句:
def alarm_clock(day, vacation):
if vacation:
if weekend:
return "off"
else:
return "10:00"
else:
if weekend:
return "10:00"
else:
return "7:00"
...或以更高的逻辑级别重构它:
def alarm_clock(day, vacation):
if vacation and weekend:
return "off"
elif vacation or weekend:
return "10:00"
else:
return "7:00"
......显而易见的是,这个问题一开始就不会出现。
它还避免了另一个非常常见的错误,即人们将not
与and
或or
的组合仅仅中途消除,并最终得到{{{{{ 1}}当你的意思是not a and b
。
它使您的代码对扩展更加健壮 - 如果您以后决定在例如从星期一而不是星期日开始编号周的国家/地区运行代码,则只需更改一行代码而不是四行代码线条(四条线几乎足以保证你的错误之一......)。