如果声明命令

时间:2013-12-21 00:24:39

标签: python operator-precedence

我正在使用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”值?

5 个答案:

答案 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"

......显而易见的是,这个问题一开始就不会出现。

它还避免了另一个非常常见的错误,即人们将notandor的组合仅仅中途消除,并最终得到{{{{{ 1}}当你的意思是not a and b

它使您的代码对扩展更加健壮 - 如果您以后决定在例如从星期一而不是星期日开始编号周的国家/地区运行代码,则只需更改一行代码而不是四行代码线条(四条线几乎足以保证你的错误之一......)。