您的任务是编写和测试一个函数,该函数需要两个参数(一年零一个月),并返回给定月份/年份对的天数(是的,我们知道只有2月对年份值敏感) ,但我们希望我们的功能具有通用性)。现在,说服该函数在其参数没有意义的情况下返回None。
使用包含月份长度的列表。您可以在函数内部创建它-此技巧将大大缩短代码。
我记下了代码,但没有“ none”部分。有人可以帮我吗?
def IsYearLeap(year):
if (year%4==0):
return True
if (year%4!=0):
return False
def DaysInMonth(year,month):
if month in {1, 3, 5, 7, 8, 10, 12}:
return 31
elif month==2:
if IsYearLeap(year):
return 29
else:
return 28
elif month in {4,6,8,9,11}:
return 30
else:
return none
testyears = [1900, 2000, 2016, 1987,2019]
testmonths = [ 2, 2, 1, 11,4]
testresults = [28, 29, 31, 30,33]
for i in range(len(testyears)):
yr = testyears[i]
mo = testmonths[i]
print(yr,mo,"->",end="")
result = DaysInMonth(yr,mo)
if result == testresults[i]:
print("OK")
else:
print("Failed")
答案 0 :(得分:0)
您似乎犯了一个简单的错误。如果您不使用区分大小写的编程语言或没有编程语言的经验,那么这是可以理解的。
关键字None
的拼写错误是未定义的单词none
。
答案 1 :(得分:0)
我认为您的测试结果是错误的。 1900年2月应为29天,2019年4月应为30天。也是无,而不是无。另外,最好使用月列表上的列表,以便可以使用[1、3、5、7,...]代替{1、3、5、7,...}。
从您的测试用例中也不会得到None,如果您想检查这种情况,可以以month = 13进行检查,并且您将涵盖此情况
答案 2 :(得分:0)
作为对该问题其他良好答案的进一步评论,leap年的正确规则应为:
def is_leap_year(year):
""" is it a leap year?
>>> is_leap_year(1984)
True
>>> is_leap_year(1985)
False
>>> is_leap_year(1900)
False
>>> is_leap_year(2000)
True
"""
return (year % 4 == 0 and
(year % 100 != 0 or year % 400 == 0))
类似地,测试用例需要清楚,1900年不是a年,而2000年不是a年。我建议为is_leap_year
编写一组单独的测试用例。最终,在生产代码中,最好使用许多时间/日期库之一。我提供的评论利用doctest来快速提供此单元测试。
答案 3 :(得分:0)
一个没有显式 { MongoError: Cannot create field 'likes' in element {commentList: [ { likes: { totalLikes: 0, likeList: [] },
_id: ObjectId('5cf6b3293b61fe06f48794e3'), user: ObjectId('5c9bf6eb1da18b038ca660b8'), avatar: "https://sli.blob.core.windows.net/stuli/
profile-picture-e1367a7a-41c2-4ab4-9cb5-621d2008260f.jpg", name: "Luke Skywalker", text: "Test comment from Luke", repliesToComment: [], date: new Date(1559671593009) } ]}
隐式返回的函数return
。
除了拼写错误(None
和none
)以外,您在这里还偶然使用了此错误:
None
如果两个条件都不成立,您能看到会发生什么? def IsYearLeap(year):
if (year%4==0):
return True
if (year%4!=0):
return False
或return
都不会False
,这可能是呼叫者期望的。 (尽管如果您检查True
是否会得到None == True
,而False
是not None
,则不会出现语法错误,只是结果可能有所不同出乎您的意料-最糟糕的错误!)
答案 4 :(得分:0)
def IsYearLeap(year):
return year % 4 == 0 & (year % 400 == 0 | year % 100 != 0)
def DaysInMonth(year,month):
if month in [1, 3, 5, 7, 8, 10, 12]:
return 31
elif month==2:
if IsYearLeap(year):
return 29
else:
return 28
elif month in [4,6,8,9,11]:
return 30
else:
return None
#
testYears = [1900, 2000, 2016, 1987]
testMonths = [2, 2, 1, 11]
testResults = [28, 29, 31, 30]
for i in range(len(testYears)):
yr = testYears[i]
mo = testMonths[i]
print(yr, mo, "->", end="")
result = DaysInMonth(yr, mo)
if result == testResults[i]:
print("OK")
else:
print("Failed")
答案 5 :(得分:0)
def is_year_leap(year):
return year % 4 == 0 and year % 100 != 0 or year % 400 == 0
def days_in_month(year, month):
days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if type(year) != int or year < 1582 or\
type(month) != int or month < 1 or month > 12:
return None
elif is_year_leap(year):
del days[1]
days.insert(1, 29)
return days[month - 1]
test_years = [1900, 2000, 2016, 1987]
test_months = [2, 2, 1, 11]
test_results = [28, 29, 31, 30]
for i in range(len(test_years)):
yr = test_years[i]
mo = test_months[i]
print(yr, mo, "->", end="")
result = days_in_month(yr, mo)
if result == test_results[i]:
print("OK")
else:
print("Failed")