【问题标题】:Program not working for tuesday but working for sunday程序周二不工作,但周日工作
【发布时间】:2021-02-09 16:23:49
【问题描述】:

我正在使用一本名为“如何像计算机科学家一样思考”的书来学习 Python。他们在那里做了一个练习:

Write  a  function  that  helps  answer  questions  like  “‘Today  is  Wednesday.
I  leave  on holiday in 19 days time. What day will that be?”’
 So the function must take a day name and a delta argument — the number of days
 to add — and should return the resulting day name:
test(day_add("Monday", 4) ==  "Friday")
test(day_add("Tuesday", 0) == "Tuesday")
test(day_add("Tuesday", 14) == "Tuesday")
test(day_add("Sunday", 100) == "Tuesday")
Hint: use the first two functions written above to help you write this one

Can your day_add function already work with negative deltas? For example, -1 would be yesterday, or -7 would be a week ago:
test(day_add("Sunday", -1) == "Saturday")
test(day_add("Sunday", -7) == "Sunday")
test(day_add("Tuesday", -100) == "Sunday")

我写了这个程序

import sys

def test(did_pass):
    '''prints result of test at last'''
    linenum=sys._getframe(1).f_lineno    #gets call line
    if did_pass:
        msg='Test at line {0} PASS'.format(linenum)
    else:
        msg=('Test at line {0} FAIL.'.format(linenum))
    print(msg)


def day_name(x):
    '''converts  day number to day'''
    if x==0:
        return 'Sunday'
    elif x==1:
        return 'Monday'
    elif x==2:
        return 'Tuesday'
    elif x==3:
        return 'Wednesday'
    elif x==4:
        return 'Thursday'
    elif x==5:
        return 'Friday'
    elif x==6:
        return 'Saturday'
    else:
        return

def day_num(y):
    '''converts day to day number'''
    if y=='Sunday':
        return 0
    elif y=='Monday':
        return 1
    elif y=='Tuesday':
        return 2
    elif y=='Wednesday':
        return 3
    elif y=='Thursday':
        return 4
    elif y=='Friday':
        return 5
    elif y=='Saturday':
        return 6
    else:
        return


def day_add(today, stay):
    '''input day name and remaining days to print day name'''
    result=(stay)%7
    answer=(result)+(day_num(today))
    return day_name(answer)


def test_suite():
    test(day_add("Sunday", -1) == "Saturday")
    test(day_add("Sunday", -7) == "Sunday")
    test(day_add("Tuesday", -100) == "Sunday")
test_suite()

所以第一个功能是测试我的程序是否存在错误。问题是前两个测试很清楚,但最后一个测试失败,即使它与前两个具有相同的负值。我想知道使前两个测试通过但后来失败的错误是什么。我是初学者,所以请使用一些简单的语句。

【问题讨论】:

  • 您没有缩放answer 的值。 resultdaynum(today) 都可以小于 7,而 sum 不小于 7。
  • 您的工作,在此处提出问题之前,是隔离特定故障并提出一个问题,该问题包含除该故障点之外的所有内容(以及到达该故障点所需的代码)被淘汰——minimal reproducible example.
  • 应该是(day_num(today) + stay)%7
  • 如果你有 day_name 以同样的方式处理超出范围的值,它也会更简单,例如day_name(7) 返回 "Sunday" 而不是 None
  • 对失败进行数学计算。 -100 % 7 是 5,5 + 2 = 7(不在 0-6 范围内)。你的数学错了。

标签: python function return


【解决方案1】:

你的计算是错误的。关注How to debug small programs 将代码更改为

def day_add(today, stay):
    '''input day name and remaining days to print day name'''
    result = stay % 7
    answer = result + day_num(today)
    print(result, day_num(today), day_name(answer)) # DEBUG your code
    return day_name(answer)

输出:

6 0 Saturday
Test at line 34 PASS

0 0 Sunday
Test at line 35 PASS

5 2 None                        # analyze this and fix it.
Test at line 36 FAIL.

【讨论】:

  • 我建议只计算 stay + day_num(today) 并让 day_name 处理将总和覆盖为有效名称,因为无论如何(stay % 7 + day_num(today))%7 == (stay + day_num(today))%7
  • 非常感谢。您提供的有关调试的链接非常有帮助。我不知道调试有那么大的帮助。现在我将首先调试这个程序并尝试自己解决。如果它对我不起作用,我将使用您的代码作为帮助。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多