简单逻辑Python 3

时间:2015-04-27 09:48:35

标签: python

嘿所以我坚持这个问题,不知道为什么我的代码不起作用。任何帮助表示赞赏。欢呼声。

  

编写一个需要int天的函数alarm_clock(day, on_vacation)   (编码为0 = Sun,1 = Mon,2 = Tue,... 6 = Sat)和布尔值on_vacation   并返回"7:00"形式的字符串,指示警报何时   时钟应响。平日,警报应为"7:00"并且在   周末应该是"10:00"。除非我们休假 - 然后再去   工作日应为"10:00",周末应为"off"

例如:

  • print(alarm_clock(1, False))提供7:00
  • print(alarm_clock(0, True))提供off

我有:

def alarm_clock(day, on_vacation):

'''Alarm Clock'''

if day in range(1-6) and on_vacation is True:
    return '10:00'
elif day is 0 or 7 and on_vacation is True:
    return 'off'
elif day in range(1-6) and on_vacation is False:
    return '7:00'
elif day is 0 or 7 and on_vacation is False:
    return '10:00'

5 个答案:

答案 0 :(得分:4)

if day in range(1-6) and on_vacation is True:

这应该是

if day in range(1, 7) and on_vacation:

否则,range(1-6)确实是range(-5)

答案 1 :(得分:2)

如果你提供输出,那么更容易确定究竟是什么关闭,但我确实看到你为你的数字使用了错误的整数集。您希望能够传递函数的完整集是

[0,1,2,3,4,5,6]

你错误地测试了你的两条线路中的7条线,想到了一周中的7天。但是从0开始的索引只会在一周的几天内达到6,因为你包含了数字0.此外,你用于范围的语法是错误的,它的格式应该是范围(1, 6)

我认为你期望它具有包容性,即

range(1,6) = [1,2,3,4,5,6]

但它实际上会返回

range(1,6) = [1,2,3,4,5]

因为它从提供的第一个数字到第二个数字,但包含它。

以下是编写代码的方法:

def alarm_clock(day, on_vacation):
    '''Alarm Clock'''
    if on_vacation:
        if day in range(1,6):
            return '10:00'
        elif day in [0,6]:
            return 'off'
    else:
        if day in range(1,6):
            return '7:00'
        elif day in [0,6]:
            return '10:00'

我更改了条件流程,以便更容易理解和调试。分支更多而不是根据两种条件得到所有四个结果通常会更好。

答案 2 :(得分:1)

如果不休假,只有两个结果,如果不是,则只有两个结果:

def alarm_clock(day, on_vacation):
    if on_vacation: # same as explicitly asking if on_vacation is True
        # if on vacation set it to off else set to weekday time
        return "off" if day in {0,6} else "10:00"
    # else not on vacation so 10:00 for wkend and 7 for weekday
    return "10:00" if day in {0, 6} else "07:00"

如果在度假时,您要么将警报设置为10或关闭,如果没有休假,则警报为10或7.您可能还需要检查当天是否有效并在用户输入时输出相应的消息有效范围之外的一天。

在检查相等性时你也应该使用==is只会发生工作,因为在python中缓存了小的int,如果超出该范围,你会看到你的测试失败:

In [16]: day = 256
In [17]: day is 256
Out[17]: True
In [12]: day = 257    
In [13]: day is 257
Out[13]: False
In [22]: day =  257
In [23]: day ==  257
Out[23]: True

使用0-6的一系列整数不会遇到问题,但一般情况下使用==is会检查对象的身份,看看它们实际上是否是同一个对象, ==检查相等性,即两个对象是否具有相等的值。

只是为了好玩,一种不同的方式:

def alarm_clock(day, on_vacation):
    return {0: ["10:00", "off"], 6: ["10:00", "off"]}.get(day, ["07:00", "10:00"])[on_vacation]

答案 3 :(得分:0)

如果是if / elif / else问题,那么您的答案可以range(1-6)改变range(1,7)

但是如果/ elif / else通常很难阅读。这里的周末和on_vacation可以理解为累积奖金。使用列表索引,您还可以写:

def week_end(day): return (day%6 == 0) 
def alarm_clock(day,on_vacation):
    return ['7:00','10:00','off'][week_end(day) + on_vacation]

答案 4 :(得分:0)

以下将是预期的解决方案:

def alarm_clock(day, on_vacation):
    if day in range(1,7) and on_vacation:
        print ('10:00')
    elif day is 0 or 7 and on_vacation is True:
        print ('off')
    elif day in range(1,7) and on_vacation is False:
        print ('7:00')
    elif day is 0 or 7 and on_vacation is False:
        print ('10:00')
alarm_clock(day_of_the_week,is_on_vacation)