美文网首页
案例(5):判断第几天

案例(5):判断第几天

作者: hwang_zhic | 来源:发表于2019-03-13 13:11 被阅读0次

本章通过判断第几天的4个案例来进行学习基础的Python程序

案例描述

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

分析:

每个月份的天数不同;
闰年与平年的2月份天数不同,平年是28天,闰年是29天
闰年判断:
四年一闰,百年不闰,四百年再闰

v1.0

新建一个简单的Python程序,先引用datatime库中的datatime,将规定格式输入的日期格式化,借此计算出年月日。每个月份的天数按平年存储并计算。存储使用元组数据类型,通过累加sum()元组的月份索引再加上本月天数即可得出平年时第几天,通过判断若为闰年则天数+1,否则跳过。

知识点:
1.元组
(1)元组(tuple)是特殊的序列类型
(2)一旦被创建就不能修改,使得代码更安全。不可以修改、删除、添加元素
(3)使用逗号和圆括号来表示,如 (‘red’, ‘blue’, ‘green’), (2, 4, 6) PS:元组只包含一个元素时,一定要在后面加上逗号。如:student = (50,)
(4)访问方式和列表相同
(5)一般用于表达固定数据项、函数多返回值等情况
(6)特点
  a)元组中的元素可以是不同类型的
  b)元组中各元素存在先后关系,可通过索引访问元组中元素
  c)对元组集合内元素求和:sum(tuple)



(7)元组的内置函数


PS:Python元组的更多信息参考:
https://baijiahao.baidu.com/s?id=1607300920211170540&wfr=spider&for=pc
Python基本数据类型总结:https://blog.csdn.net/Q_Jimmy/article/details/80247559

主体代码

    # 输入日期
    input_date_str = input("请输入日期(yyyy/mm/dd):")
    # 日期格式化
    input_date = datetime.strptime(input_date_str, "%Y/%m/%d")
    # 分别是年、月、日
    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)
    # 计算当前第几天
    days = sum(days_in_month_tup[:month - 1]) + day
    # 判断是否闰年
    if (year%400 == 0) or ((year%4 == 0) and (year%100 != 0)):
        # 判断是否大于2月份
        if month > 2:
            days += 1

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

运行结果:


v2.0

在v1.0的基础上,2.0增加功能:用列表替换元组。列表元素可以修改,如果是闰年直接将2月份的天数改成29。首先将判断闰年语句集合成函数is_leap_year中,输入年份即可返回是否为闰年。接着将存储每月份天数的元组更改为列表,当判断为闰年时直接改列表中2月份天数为29。计算天数则直接sum列表+当月天数。注意列表月份要 - 1。
知识点:
1.列表和元组区别
(1)元组是不可变的,列表是可变的
(2)元组通常由不同的数据组成,列表通常是由相同类型的数据组成
(3)元组表示的是结构,列表表示的是顺序

PS:“文化差异“是指二者在实际使用中的差异:在你有一些不确定长度的相同类型队列的时候使用列表;在你提前知道元素数量的情况下使用元组,因为元素的位置很重要。
举个例子,假设你有一个函数是用来在目录中查找结尾为 *.py 的文件。函数返回的应该是一个列表,因为你并不知道你会找到多少个文件,而这些文件都有相同的含义:它们仅仅是你找到的另一个文件。
另一方面,让我们假设你需要存储五个值来代表气象观测站的位置:id ,城市,国家,纬度,经度。元组就比列表更适用于这种情况:
PS:列表与元组的区别参考文章:http://python.jobbole.com/86661/

具体代码:

from datetime import datetime

def is_leap_year(year):
    """
        判断是否闰年
    """
    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")
    # 分别是年、月、日
    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]
    # 判断是否闰年,闰年则+1
    if is_leap_year(year):
        days_in_month_list[1] = 29
    # 计算当前第几天
    days = sum(days_in_month_list[:month - 1]) + day

    print("该日期为第{}年的第{}天".format(year, days))

运行结果:

v3.0

在2.0的基础上,3.0增加功能:将月份划分为不同的集合再操作。将月份分为2个集合,分别为30天的和31天的。for迭代循环月份对象,判断i月份在哪个集合,若30则计数加30,若31则计数加31,若两个都不在则加28。最后判断是否为闰年,再加1。

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

PS:Python基本数据类型总结:
https://blog.csdn.net/Q_Jimmy/article/details/80247559

集合操作效果图:


例子主要代码如下:

from datetime import datetime

def is_leap_year(year):
    """
        判断是否闰年
    """
    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")
    # 分别是年、月、日
    year = input_date.year
    month = input_date.month
    day = input_date.day
    # 30天月份集合
    _30_days_in_month = {4, 6, 9, 11}
    # 31天月份集合
    _31_days_in_month = {1, 3, 5, 7, 8, 10, 12}

    days = 0
    days += day
    # 计算当前第几天
    for i in range(1, month):
        if i in _30_days_in_month:
            days += 30
        elif i in _31_days_in_month:
            days += 31
        else:
            days += 28

    # 判断是否闰年,闰年则+1
    if is_leap_year(year):
        days += 1

    print("该日期为第{}年的第{}天".format(year, days))

代码部分运行结果:


v4.0

在v3.0的基础上,4.0增加功能:将月份及其对应天数通过字典表示。字典有两个版本,分别是月份-天数字典和天数-月份字典。数据存放key和value分别为月份和天数。这两个版本都有不同的计算天数方式。最终也是判断是否闰年,是则加1。
知识点:
1.字典
(1)字典类型(dict)是“键--值”数据项的组合,每个元素是一个键值对。如:身份证号(键)--个人信息(值)
(2)字典类型数据通过映射查找数据项
(3)映射:通过任意键查找集合中的值的过程
(4)字典类型的数据是无序的
(5)字典类型以键为索引,一个键对应一个值
(6)字典的键值不可以为list或者set类型,可以是tuple

PS:Python的字典类型操作详解:https://www.cnblogs.com/scios/p/8108243.html

字典操作示例:


主要代码:

    # 输入日期
    input_date_str = input("请输入日期(yyyy/mm/dd):")
    # 日期格式化
    input_date = datetime.strptime(input_date_str, "%Y/%m/%d")
    # 分别是年、月、日
    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
    }
    # 天数-月份字典
    day_month_dict = {
        30: {4, 6, 9, 11},
        31: {1, 3, 5, 7, 8, 10, 12}
    }

    # 初始化days,并加上当月天数
    days = 0
    days += day

    # # 计算当前第几天v1.0
    # for i in range(1, month):
    #     days += month_day_dict[i]

    # 计算当前第几天v2.0
    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

    # 判断是否闰年,闰年则+1
    if is_leap_year(year):
        days += 1

    print("该日期为第{}年的第{}天".format(year, days))

执行结果:


总结

判断第几天的4个例子,知识点归纳如下:


PS:Python提供了一个可以直接获取“第几天”的方法,一行代码就能完成


完整代码查看码云

相关文章

网友评论

      本文标题:案例(5):判断第几天

      本文链接:https://www.haomeiwen.com/subject/hlrceqtx.html