判断第几天要实现的功能:输入具体时间,判断是一年中的第几天。

(1)将输入的时间由str类型转化为datetime类型需要datetime库中的datetime.strptime函数,而.year,.month,.day分别提取int型的年、月、日。

(2)一年中各月份对应的天数可以用不同的数据结构表示,1.0,2.0,3.0,4.0分别用元组,列表,集合和字典表示。

1.0:将每月对应的天数按照顺序放入一个元组中(2月先输入28天),得到输入的月份后对元组中的切片(:month-1)元素求和(注意:元组的索引比月份小1)。这里默认2月有28天,对于闰年的情况需要进行判断,如果输入的是闰年并且月份大于2时,需要多加一天,如果月份不大于2,即使是闰年也不需要多加一天。

"""


1.0:判断一年中的第几天
"""
from datetime import datetime
def main():
date_str = input("请输入日期(yyyy/mm/dd):")
date_input = datetime.strptime(date_str,"%Y/%m/%d")
year = date_input.year
month = date_input.month
day = date_input.day
days_in_tup = (31,28,31,30,31,30,31,31,30,31,30,31)
days = sum(days_in_tup[:month-1]) + day
if (year%100!=0 and year%4==0) or (year%400 ==0):
if month>2:
days +=1
print("这是一年中的第{}天".format(days))
if __name__=="__main__":
main()
2.0:首先对判断闰年的函数进行封装,使得代码更结构化。用列表代替元组。列表与元组最大的区别在于列表可以更改,而元组不可变。将每月对应的天数按照顺序放入列表中(2月输入28天),然后判断输入的年份是否为闰年,如果是闰年,将列表中2 月对应的天数改为29,最后对列表中的切片元素求和。
"""
2.0:用列表代替元组
"""
from datetime import datetime
def is_leap_year(year):
leap = False
if (year % 100 != 0 and year % 4 == 0) or (year % 400 == 0):
leap = True
return leap
def main():
date_str = input("请输入日期(yyyy/mm/dd):")
date_input = datetime.strptime(date_str,"%Y/%m/%d")
year = date_input.year
month = date_input.month
day = date_input.day
days_in_list = [31,28,31,30,31,30,31,31,30,31,30,31]
if is_leap_year(year):
days_in_list[1] = 29
days = sum(days_in_list[:month-1]) + day
print("这是{}年中的第{}天".format(year,days))
if __name__=="__main__":
main()
3.0:将不同天数的月份用集合表示,创建两个集合,分别是天数为30天和31天的月份,这两个集合均不包括2月,days(求得总天数)的初始值为输入的日期当月的天(day),通过循环遍历输入的月份之前的月份,若第i月有31天(判断i在哪个集合中)days中加31,若第i月有30天,days加30,当遍历至2月时,days加28。最后判断是否为闰年,如果是闰年且输入月份大于2,days+1。
"""
3.0:将月份用不同的集合表示
"""
from datetime import datetime
def is_leap_year(year):
leap = False
if (year % 100 != 0 and year % 4 == 0) or (year % 400 == 0):
leap = True
return leap
def main():
date_str = input("请输入日期(yyyy/mm/dd):")
date_input = datetime.strptime(date_str,"%Y/%m/%d")
year = date_input.year
month = date_input.month
day = date_input.day
days = day
_30days_month = {4,6,9,11}
_31days_month = {1,3,5,7,8,10,12}
for i in range(1,month):
if i in _30days_month:
days += 30
elif i in _31days_month:
days += 31
else:
days += 28
if is_leap_year(year) and month > 2:
days += 1
print("这是{}年中的第{}天".format(year,days))
if __name__=="__main__":
main()
4.0:将月份与对应的天数用字典表示。字典的访问同列表不同,字典的访问索引为键。
(1)键为月份,值为天数。days初始值为day,然后遍历输入的月份之前的每一个月,days加上键i对应的值(2月28天),最后判断是否为闰年,如果是闰年且月份大于2,days+1。
"""
4.0:将月份和对应的天数用字典表示
"""
from datetime import datetime
def is_leap_year(year):
leap = False
if (year % 100 != 0 and year % 4 == 0) or (year % 400 == 0):
leap = True
return leap
def main():
date_str = input("请输入日期(yyyy/mm/dd):")
date_input = datetime.strptime(date_str,"%Y/%m/%d")
year = date_input.year
month = date_input.month
day = date_input.day
days = day
month_day_dict = {
1:31,
2:28,
3:31,
4:30,
5:31,
6:30,
7:31,
8:31,
9:30,
10:31,
11:30,
12:31
}
for i in range(1,month):
days += month_day_dict[i]
if is_leap_year(year) and month > 2:
days += 1
print("这是{}年中的第{}天".format(year,days))
if __name__=="__main__":
main()
(2)键为天数,值为对应的月份(不包括2月份)。通过访问字典的键获得对应的月份,后面的代码同3.0。
"""
4.0:将月份与天数用字典表示
"""
from datetime import datetime
def is_leap_year(year):
leap = False
if (year % 100 != 0 and year % 4 == 0) or (year % 400 == 0):
leap = True
return leap
def main():
date_str = input("请输入日期(yyyy/mm/dd):")
date_input = datetime.strptime(date_str,"%Y/%m/%d")
year = date_input.year
month = date_input.month
day = date_input.day
days = day
day_month_dict = {
31:{1,3,5,7,8,10,12},
30:{4,6,9,11}
}
for i in range(1,month):
if i in day_month_dict[30]:
days += 30
elif i in day_month_dict[31]:
days += 31
else:
days += 28
if is_leap_year(year) and month > 2:
days += 1
print("这是{}年中的第{}天".format(year,days))
if __name__=="__main__":
main()