在某网络教材中看到这样一个习题:用函数实现输入某年某月某日,判断这一天是这一年的第几天?闰年情况也考虑进去。
这个题目,之前在网上见过别人的代码,也有相应的函数可以很简单的得出答案。但为了锻炼一下脑子,我决定从头开始编写一个,一个库也不导入,完全手敲代码。
思路如下:
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
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!