【发布时间】: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的值。result和daynum(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 范围内)。你的数学错了。