判断第几天

该博客介绍了一个Python程序,用于根据输入的日期计算这一年中的第几天。程序考虑了闰年和平年的2月份天数差异,并通过迭代月份和天数进行计算。在不同版本中,程序逐步优化,从元组到列表,再到集合操作,最后采用字典存储月份和对应天数,提高了代码的可读性和效率。

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

判断第几天

V1.0

案例描述:

  • 输入某年某月某日,判断这一天是这一年的第几天?
  • Demo:
    • 输入的日期为2017/03/05,是2017年的第几天?
    • 输入的日期为2012/03/05,是2012年的第几天?

案例分析:

  1. 每个月份的天数不同
  2. 闰年与平年的2月份天数不同
  3. 闰年判断:
    • 四年一闰且百年不闰
    • 或四百年再闰

上机实验:

"""
    功能:输入某年某月某日,判断这一天是这一年的第几天?
"""

from datetime import datetime


def main():
    """
        主函数
    """
    input_date_str = input('请输入日期(yyyy-mm-dd):')
    input_date = datetime.strptime(input_date_str, '%Y-%m-%d')
    print(input_date)

    year = input_date.year
    month = input_date.month
    day = input_date.day

    # 计算之前月份天数的总和以及当前月份天数
    days_in_month_tup = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
    # print(days_in_month_tup[: month - 1])
    days = sum(days_in_month_tup[: month - 1]) + day

    if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
        if month > 2:
            days += 1

    print('这是第{}天:'.format(days))


if __name__ == '__main__':
    main()

补充说明:

1. 元组

  • 元组(tuple)是特殊的序列类型
  • 一旦被创建就不能修改,使得代码更安全
  • 使用逗号和圆括号来表示,如('red', 'blue', 'green'), (2, 4, 6)
  • 访问方式和列表相同
  • 一般用于表达固定数据项、函数多返回值等情况

2. 特点

  • 元组中的元素可以是不同类型的
  • 元组中个元素存在先后关系,可通过索引访问元组中元素

 


V2.0增加功能:用列表替换元组

上机实验:

"""
    功能:输入某年某月某日,判断这一天是这一年的第几天?
    2.0增加功能:用列表替换元组
"""

from datetime import datetime


def is_leap_year(year):
    """
        判断year是否为闰年
        是:返回True
        否:返回False
    """
    is_leap = False

    # 判断闰年
    if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
        is_leap = True

    return is_leap


def main():
    """
        主函数
    """
    input_date_str = input('请输入日期(yyyy-mm-dd):')
    input_date = datetime.strptime(input_date_str, '%Y-%m-%d')
    print(input_date)

    year = input_date.year
    month = input_date.month
    day = input_date.day

    # 计算之前月份天数的总和以及当前月份天数
    days_in_month_list = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

    # 判断闰年
    if is_leap_year(year):
        days_in_month_list[1] = 29

    days = sum(days_in_month_list[: month - 1]) + day

    print('这是{}年的第{}天'.format(year, days))


if __name__ == '__main__':
    main()

补充说明:

1. 列表与元组

  • 元组是不可变的,列表是可变的
  • 元组通常由不同的数据组成,列表通常是由相同类型的数据组成
  • 元组表示的是结构,列表表示的是顺序

V3.0增加功能: 将月份划分为不同的集合再操作

上机实验:

"""
    功能:输入某年某月某日,判断这一天是这一年的第几天?
    3.0增加功能: 将月份划分为不同的集合再操作
"""

from datetime import datetime


def is_leap_year(year):
    """
        判断year是否为闰年
        是:返回True
        否:返回False
    """
    is_leap = False

    # 判断闰年
    if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
        is_leap = True

    return is_leap


def main():
    """
        主函数
    """
    input_date_str = input('请输入日期(yyyy-mm-dd):')
    input_date = datetime.strptime(input_date_str, '%Y-%m-%d')
    print(input_date)

    year = input_date.year
    month = input_date.month
    day = input_date.day

    # 包含30天的月份集合
    _30_days_month_set = {4, 6, 9, 11}
    _31_days_month_set = {1, 3, 5, 7, 8, 10, 12}

    # 初始化值
    days = day

    for i in range(1, month):
        if i in _30_days_month_set:
            days += 30
        elif i in _31_days_month_set:
            days += 31
        else:
            days += 28

    if is_leap_year(year) and month > 2:
        days += 1

    print('这是{}年的第{}天'.format(year, days))


if __name__ == '__main__':
    main()

补充说明:

1. 集合

  • Python中的集合(Set)类型同数学中的集合概念一致,即包含0或多个数据项的无序组合
  • 集合中的元素不可重复
  • 集合是无序组合,没有索引和位置的概念
  • set()函数用于集合的生成,返回结果是一个无重复且排序任意的集合
  • 集合通常用于表示成员间的关系、元素去重等

2. 集合操作

 

 


 V4.0增加功能:将月份及其对应天数通过字典表示

上机实验:

"""
    功能:输入某年某月某日,判断这一天是这一年的第几天?
    4.0增加功能:将月份及其对应天数通过字典表示
"""

from datetime import datetime


def is_leap_year(year):
    """
        判断year是否为闰年
        是:返回True
        否:返回False
    """
    is_leap = False

    # 判断闰年
    if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
        is_leap = True

    return is_leap


def main():
    """
        主函数
    """
    input_date_str = input('请输入日期(yyyy-mm-dd):')
    input_date = datetime.strptime(input_date_str, '%Y-%m-%d')
    print(input_date)

    year = input_date.year
    month = input_date.month
    day = input_date.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}

    # 初始化值
    days = day

    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()

补充说明:

1. 字典

  • 字典类型(dict)是“键-值”数据项的组合,每个元素是一个键值对,如:身份证号(键)- 个人信息(值)
  • 字典类型数据通过映射查找数据项
  • 映射:通过任意键查找集合中的值的过程
  • 字典类型以键为索引,一个键对应一个值
  • 字典类型的数据是无序的

2. 字典操作

  • 增加一项:d[key] = value
  • 访问:d[key]
  • 删除某项:del d[key]
  • key是否在字典中:key in d

3. 字典的遍历

  • 遍历所有的key:
1 for key in d.keys():
2     print(key)
  • 遍历所有的value:
1 for value in d.values():
2     print(value)
  • 遍历所有的数据项:
1 for item in d.items():
2     print(item)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值