【Python打卡2019】20190428之根据日期算whichday-集合set

本文介绍了一种使用Python的set集合优化日期计算的方法,通过替换原有的列表实现,提高了判断输入日期为当前年份第几天的程序效率。文章详细解释了Python集合的概念及如何应用于日期计算,展示了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值