0.目标描述
将之前的whichday程序改成使用set集合来取代元素或列表;
1.set集合
- Python中的集合概念和数学中的集合概念是一致的;
- 这意味着,Python中的集合中的元素是无序且不重复的;
- 使用set()这个函数就可以创建咯;
- 与此同时,set支持集合运算,比如集合s和t,s-t表示在s但不在t中;s&t表示同时在s和t中(交集运算);s|t表示在s或t中(并集运算),s^t表示在s或t但不同时在s和t中的元素;
2.程序与结果
"""
判断输入日期为当前年份的第几天
用列表代替元组
+用集合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
# 用集合代替列表
# 由于集合中无法存储相同元素,所以我们转换思路,创建两个集合,分别代表30和31天的月份
# month_days_list = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
_31_days_month_set = {1, 3, 5, 7, 8, 10, 12} # 大括号直接创建集合
_30_days_month_set = {4, 6, 9, 11}
total_month_days = 0
# 这样的话,我们看一从1月计算到month月来进行天数的计算
for i in range(1, month): # range(1, n)表示从1月到month-1月,正好满足我们的需要
if i in _30_days_month_set: # 如果是小月份,加30
total_month_days += 30
elif i in _31_days_month_set: # 如果是大月份,加31
total_month_days += 31
else: # 如果是2月,先加28,闰年再加1
total_month_days += 28
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/WhichDay3.py
请输入日期(yyyy/mm/dd):2019/04/28
2019/04/28是当年的第118天~(集合取代列表)
Process finished with exit code 0
Y:\Python\Anaconda\python.exe Y:/PythonWorkspace/lect06/WhichDay3.py
请输入日期(yyyy/mm/dd):2016/04/28
2016/04/28是当年的第119天~(集合取代列表)
Process finished with exit code 0