2015-04-27 101 views
2

嘿所以我被困在这个问题上,不知道为什么我的代码不工作。任何帮助表示赞赏。干杯。简单的逻辑Python 3

写功能alarm_clock(day, on_vacation)这需要 一个int天(编码为0 =星期日,1 =星期一,2 =星期二,... 6 =星期六)和一个布尔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' 
+0

你从你的代码得到什么输出? – SuperBiasedMan

+0

此外,为什么你使用范围0到7,我认为是一周中的几天? – SuperBiasedMan

+0

因为这就是我们被告知在问题中使用:) – Mikey

回答

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)

+0

'1 <=日<= 6'可能是一个更好的测试比'范围内的日期(1,7 )' –

+0

@tobias_k它更加明确,并且在Python 2.x中不需要为线性扫描构建一个列表 - 在3.x中 - 它不那么重要,因为有“cleverer”成员测试......所以六个之一,半打另一个 –

+0

此外,还有另一个问题'天是0或7'... –

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缓存,如果你去超出这个范围,你会看到你的测试失败:

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] 
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' 

我改变了条件流,试图使其更易于理解和调试。通常更好地分支更多,而不是基于这两种条件得到全部四个结果。

+1

12 = 12是真'评估'假',因为这些表达式开始评估最后的结果。 '12是True' =>'False'(12本身既不是真也不是假,只有12的存在可以评估真或假),'12 == False' =>'False'。你可以通过'(12 ==(12是True))==(12 == 12是True)'来检查它,它将评估为真。 但'(12 == 12)为True'会评估为“真”。不管它存在于哪部分内存中,总是'真'是真'。 – marmeladze

+0

你是对的,我完全误解了这一点。我要编辑我的答案以删除所有这些,因为我注意到数字范围使用错误,所以这可能是真正的罪魁祸首。 – SuperBiasedMan

0

如果这是一个if/elif/else问题,您的答案很好改变range(1-6)range(1,7)

但是,如果/ elif/else经常难以阅读。在这里,每周的结束日期和结束时间可以理解为累积奖金。使用列表索引,你也可以写:

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]