Python小练习判断这一天是这一年的第几天?

在某网络教材中看到这样一个习题:用函数实现输入某年某月某日,判断这一天是这一年的第几天?闰年情况也考虑进去。

这个题目,之前在网上见过别人的代码,也有相应的函数可以很简单的得出答案。但为了锻炼一下脑子,我决定从头开始编写一个,一个库也不导入,完全手敲代码。

思路如下:

1、输入日期日采用8位的标准格式,如果输入错误的话,提示错误并退出。要按顺序检测以下错误:

  • 输入的不是纯数字
  • 输入的数字不是8位
  • 输入的月份错误
  • 输入的最后两位日期错误

2、排除了输入错误后,开始计算日期。天数分为两部分,已经走完的月份,那就是将所有走完的月份加和,当前月份取值最后两位。如输入日期为20240301,那就先把1、2月加一起,为60天,然后再加上3月份的1天,一共61天。

各月份日期列表,我用的是列表形式,12个月的天数都在列表里。这里,为了简便(偷懒),我将闰年和非闰年各建了一个列表。

3、计算完毕,返回天数。

代码如下:

#自定义函数
def shutian(date):
    run = False#初始为非闰年
    #非闰年的每月天数
    m_12=[31,28,31,30,31,30,31,31,30,31,30,31]
    #闰年的每月天数
    run_12=[31,29,31,30,31,30,31,31,30,31,30,31]
    
    #检查年份录入是否正确
    try :
        int(date)
    except ValueError:
        print('您可能输入错误,要求输入纯数字')
        return
    if len(date) != 8 :
        print('您输入的位数可能不是8位,请重新输入,本程序只能计算1000-9999年份的天数')
        return
    #查检月份录入是否正确
    elif int(date[4:6]) not in range(1,13):
        print('您的月份可能输入错误,请重新输入。')
        return
    #检查最后两位日期录入是否正确
    #计算是否闰年
    year = int(date[0:4])
    if (year%4 == 0  and year%100 != 0) or (year%100 ==0 and year%400 == 0):
        run = True
    
    else:
        if run:
            if int(date[6:8]) not in range(1,run_12[int(date[4:6])-1]+1):
                print('您的最后两位可能输入错误,请重新输入。')
                return            
        else:
            if int(date[6:8]) not in range(1,m_12[int(date[4:6])-1]+1):
                print('您的最后两位可能输入错误,请重新输入。')
                return         
    #日期正确的话就开始计算
    num = 0#要计算的天数,初始为0
    #计算天数,根据是否为闰年,采用不同的每月天数列表    
    for j in range(int(date[4:6])-1):
        if run:
            num += run_12[j]
        else:
            num += m_12[j]
    num += int(date[6:8])
    
    #格式化的返回值     
    return f'{date}是这一年的第{num}天!'
#运行函数,手动输入日期
shutian(input('请输入8位数日期,如20240417:'))

试运行一下,输入:20210301,返回了:’20210301是这一年的第60天!’。实现了功能,但未优化代码,感兴趣的读者可以运行并优化一下。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/74893
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 11 日 下午1:45
下一篇 2024 年 7 月 11 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注