编写和使用自己的函数-基础

时间:2019-06-06 02:40:12

标签: python

您的任务是编写和测试一个函数,该函数需要两个参数(一年零一个月),并返回给定月份/年份对的天数(是的,我们知道只有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")

6 个答案:

答案 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

除了拼写错误(Nonenone)以外,您在这里还偶然使用了此错误:

None

如果两个条件都不成立,您能看到会发生什么? def IsYearLeap(year): if (year%4==0): return True if (year%4!=0): return False return都不会False,这可能是呼叫者期望的。 (尽管如果您检查True是否会得到None == True,而Falsenot 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")