python新手练习实例之万年历

 更新时间:2022年5月19日 15:42  点击:288 作者:Begin to change

一、题目描述

A:先输出提示语句,并接受用户输入的年、月。

B:根据用户输入的年,先判断是否是闰年。

C:根据用户输入的月来判断月的天数。

D:用循环计算用户输入的年份距1900年1月1日的总天数。

E:用循环计算用户输入的月份距输入的年份的1月1日共有多少天。

F:相加D与E的天数,得到总天数。

G:用总天数来计算输入月的第一天的星期数。

H:根据G的值,格式化输出这个月的日历!

二、解析

1、分析

根据题目的八个要求,可以看出有些功能是重复或者说需要相互调用的,所以可以用模块的思想将每个要求封装成函数;

2、功能

①判断是否是闰年函数

根据闰年的判断规则,如果年是4的倍数,但不是100的倍数则是闰年或者是400的整数倍也是闰年,所以函数需要传入一个参数(年份)

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

②判断输入月的天数的函数

除了2月份会根据平年和闰年发生变化以外, 每月的天数是已经确定好的;所以此时需要调用已经定义好的判断闰年的函数才能确定二月的天数;所以函数需要传入两个参数(月份和年份)

此时有两个小技巧,一个是判断月份是那月,最开始用的是用相等加上or去判断是否满足条件,其实可以将大月或者小月的月份写到一个列表中,然后再通过in去判断;第二个是在确定天数时,可以先定义好一个常用值,然后根据月份去修改其值,最后返回常用值即可,这样就少了几行的赋值以及返回的代码

def C(year,month):
    days = 31        #31天居多,设置为默认值
    if month == 2 :    #2月份要判断是否是闰年
        if B(year):
            days=29
        else:
            days=28;
    elif month in [4,6,9,11]:     #判断小月,只有30天
        days=30
    return days

③计算年份距离1900的总天数的函数

因为平年跟闰年的天数不一样,所以要调用判断闰年的函数,确定其一年的总天数;

总天数也就是相当于求每年的天数之和即可;所以需要去遍历每年的天数求其总和即为结果;所以函数需要传入一个参数(年份)

#某年到1900年的天数
def D(year:int):
    day = 0
    for i in range(1900,year):
        if B(i):
            day +=366
        else:
            day +=365
    return day

④ 月份距离1月1日的天数的函数

距离1月1日的天数也就是每月天数的总和,此时就先需要确定其每月的天数,也就是需要调用之前定义的函数,还需要知道的是其年份判断是否闰年,所以函数需要传入两个参数(年份和月份)

遍历每月的天数(通过调用函数而来),然后将其求和,得到的就是需要的结果

#某月到1月1号的天数
def E(year:int,month:int):
    days = 0
    for i in range(1,month):
        days += C(year,i)
    return days

⑤确定星期几的函数

首先通过调用求年份距离的天数和月份的天数得到其天数总和,所以函数需要传入两个参数(月份和年份)

然后将总和加一(因为得到的是月份,而算天数时要奖当日计算再内),然后对7求余即为星期几

#确定星期几
def G(year:int,month:int):
    total_day = D(year) + E(year,month) + 1
    week = total_day % 7
    return week

⑥格式化输出日历函数

输出有两种格式,一种是星期日在第一天,一种是星期日在最后一天;

第一种方式:星期日在第一天,根据得到的星期几函数(也就是当月1号的星期几函数),可以确定第一天的位置(也就是1的位置);

日历也就是输出1到总天数(根据月份确定)在对应的位置(星期几),由于1号的位置已经确定,而一号前面的则为空,所以单独遍历输出空格,然后再输出日历;

一周对应的是七天,也就是每七天进行一次换行,所以还需要定义一个计数器

第二种方式:也就是星期日在最后一天,其他逻辑都是一样的,只是在确定1号的位置不一样;

本来周日的位置为第一个,但是现在变成了最后一个,也就是位置向后移了6位,所以只需要计算位置的时候先将其加上,然后再求余即可

#格式化输出
def my_print(total:int):
    # iCount = 0
    # print("日\t一\t二\t三\t四\t五\t六")
    # for i in range((G(year, month) % 7)):
    #     print(end='\t')
    #     iCount += 1
    # for i in range(1, C(year, month) + 1):
    #     print(i, end='\t')
    #     iCount += 1
    #     if iCount  % 7 == 0:
    #         print('')
    iCount = 0
    print('一\t二\t三\t四\t五\t六\t日\t')
    for i in range(((G(year,month) + 6) % 7)):
        print(end='\t')
        iCount +=1
    for i in range(1,C(year,month) + 1):
        print(i,end='\t')
        iCount +=1
        if iCount % 7 == 0:
            print('')

三、源码

# -*- coding: utf-8 -*-
from datetime import date
import calendar
 
# def B(year):
#    if year/4==0 and  year/400 !=0:
#        return True
#    elif year/100 == 0 and year/400 ==0 :
#        return True
#    else:
#         return False
#判断闰年
def B(year):
    if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
        return True
    return False
 
 
 
# def C(year:int,month:int):
#     days = 30
#     if month in [1,3,5,7,8,10,12]:
#         days = 31
#     elif month == 2:
#         if B(year):
#             days = 29
#         else:
#             days = 28
#     return days
#每月的天数
def C(year,month):
 
    days = 31        #31天居多,设置为默认值
    if month == 2 :    #2月份要判断是否是闰年
        if B(year):
            days=29
        else:
            days=28;
    elif month in [4,6,9,11]:     #判断小月,只有30天
        days=30
    return days
 
 
#某年到1900年的天数
def D(year:int):
    day = 0
    for i in range(1900,year):
        if B(i):
            day +=366
        else:
            day +=365
    return day
 
#某月到1月1号的天数
def E(year:int,month:int):
    days = 0
    for i in range(1,month):
        days += C(year,i)
    return days
 
#确定星期几
def G(year:int,month:int):
    total_day = D(year) + E(year,month) + 1
    week = total_day % 7
    return week
 
#格式化输出
def my_print(total:int):
    # iCount = 0
    # print("日\t一\t二\t三\t四\t五\t六")
    # for i in range((G(year, month) % 7)):
    #     print(end='\t')
    #     iCount += 1
    # for i in range(1, C(year, month) + 1):
    #     print(i, end='\t')
    #     iCount += 1
    #     if iCount  % 7 == 0:
    #         print('')
    iCount = 0
    print('一\t二\t三\t四\t五\t六\t日\t')
    for i in range(((G(year,month) + 6) % 7)):
        print(end='\t')
        iCount +=1
    for i in range(1,C(year,month) + 1):
        print(i,end='\t')
        iCount +=1
        if iCount % 7 == 0:
            print('')
 
if __name__ == '__main__':
    year = int(input('请输入年:'))
    month = int(input('请输入月'))
    my_print(G(year,month))

四、经验 

因为函数多,而且计算的结果不方便去口头的验算其结果,也就是说当结果不对时不知道是那出现的问题时,系统提供的

from datetime import date
import calendar

两个模块中有方法可以得出其天数以及星期几的结果,这样就可以查找到底是哪一步出现的问题了;也可以通过print去验证单个的函数是否正确;

总结

到此这篇关于python新手练习实例之万年历的文章就介绍到这了,更多相关python实现万年历内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://blog.csdn.net/qq_41404557/article/details/124820965

[!--infotagslink--]

相关文章

  • python opencv 画外接矩形框的完整代码

    这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • 最炫Python烟花代码全解析

    2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
  • python中numpy.empty()函数实例讲解

    在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
  • python-for x in range的用法(注意要点、细节)

    这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • python实现b站直播自动发送弹幕功能

    这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
  • python Matplotlib基础--如何添加文本和标注

    这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • python 计算方位角实例(根据两点的坐标计算)

    今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
  • python实现双色球随机选号

    这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
  • python中使用np.delete()的实例方法

    在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
  • 使用Python的pencolor函数实现渐变色功能

    这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
  • python自动化办公操作PPT的实现

    这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
  • Python getsizeof()和getsize()区分详解

    这篇文章主要介绍了Python getsizeof()和getsize()区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-20
  • python实现学生通讯录管理系统

    这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-25
  • PyTorch一小时掌握之迁移学习篇

    这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
  • 解决python 两个时间戳相减出现结果错误的问题

    这篇文章主要介绍了解决python 两个时间戳相减出现结果错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-12
  • Python绘制的爱心树与表白代码(完整代码)

    这篇文章主要介绍了Python绘制的爱心树与表白代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-06