0.任务分析与描述
此前的实现当中,我们都使用的是普通的元素集合,将月份和天数分开存储;
我们在Java中经常使用map类型进行键值对的存储,键值对能够满足将月份和天数一一对应的需求;
在Python中,我们可以通过字典来实现。
1.字典
- 字典可以通过dict()函数创建,也可以直接使用{};
- 字典中的元素无序,其中的元素为键值对形式(创建时逗号隔开两个键值对,冒号隔开键与值);
- 添加元素直接赋值,如d[1]=2;则d中为{1:2}
- 删除元素用del d[key];取出元素使用d[key]即可;
- 字典其他用法可以参考我室友的博客:https://blog.csdn.net/MessiNine/article/details/80443442
2.程序与结果
"""
判断输入日期为当前年份的第几天
用列表代替元组
+用集合set取代列表
+使用字典取代set
"""
from datetime import datetime
def is_leap_year(year):
return (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0)
def cal_which_day(date_str):
input_date = datetime.strptime(date_str, "%Y/%m/%d")
year = input_date.year
month = input_date.month
day = input_date.day
# _31_days_month_set = {1, 3, 5, 7, 8, 10, 12} # 大括号直接创建集合
# _30_days_month_set = {4, 6, 9, 11}
# 用字典代替集合,因为字典可以存储键值对,刚好可以将月份与其天数对应起来
month_days_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}
total_month_days = 0
# 这样的话,我们看一从1月计算到month月来进行天数的计算
for i in range(1, month): # range(1, n)表示从1月到month-1月,正好满足我们的需要
total_month_days += month_days_dict[i]
if is_leap_year(year) and month > 2: # 如果是闰年,且大于2月,+1
total_month_days += 1
total_days = total_month_days + day
return total_days
def main():
input_date_str = input("请输入日期(yyyy/mm/dd):")
which_day = cal_which_day(input_date_str)
print("{}是当年的第{}天~(字典取代集合)".format(input_date_str, which_day))
if __name__ == '__main__':
main()
Y:\Python\Anaconda\python.exe Y:/PythonWorkspace/lect06/WhichDay4.py
请输入日期(yyyy/mm/dd):2016/04/30
2016/04/30是当年的第121天~(字典取代集合)
Process finished with exit code 0