Python实例——检索输出月份日历表

本文详细解析了如何使用Python编写日历函数,包括计算星期几、判断闰年以及打印日历的实现。通过三个核心函数day()、isLeapYear()和calendar(),实现了日历的完整功能。文章提供了源代码并逐段分析,适合初学者学习和理解Python日期处理技巧。
摘要由CSDN通过智能技术生成

Python实例,检索输出需要的日历表

从本篇博文开始,我们的世界开始有颜色了哟,欢迎提问,持续更新中ing……
一、题目要求与分析
  根据输入的年和月,打印该月的日历。如图所示:
是有那么一点丑撒,你要愿意可以手动完善一下

  题目分析:复杂的问题往往很简单,只需要找到拆分点即可,就像这种题可以分为三个函数:
   函数1: 计算并返回某年某月某日是星期几;
   函数2: 判断某年是否是闰年;
   函数3:打印所给年月的日历.

emmm……这么一分析可能会引起很多人若有所思,对的,你的现在的思路完全正确,之所以要判定某一个日子是星期几是因为我们要知道每月的1号是周几才行(注意找日历的规律),那之所以要判定是否是闰年是因为有了二月份这一特殊的存在,最后之所以要打印,好吧,你不打印我怎么看。
准备好了吗?

为了方便起见,我们在这里直接把函数的名字给定一下:
  函数1:day(y, m, d)——y为年,m为月,d为天
  函数2: isLeapYear(year)——注意这种小驼峰的命名方式,一看就是正规军
  函数3:calendar(y, m)——打印,打印,这里会遇到很多格式性问题

二、先看源代码
纯手工打造,你不喜欢看也不得行,今天你需要把它研究一波再走咯~



def day(y, m, d):#计算y年m月d日是星期几

    y0 = y - (14 - m)//12
    x = y0 + y0//4 - y0//100 + y0 //400
    m0 = m + 12*((14 - m)//12) - 2
    d0 = (d + x + 31*m0//12) % 7
    return d0       #注意,周日是0

def isLeapYear(year): #判断year年是否闰年
    isLeapYear = True       
    if year % 4 ==0:       #整除可不是等于0,天
        if year % 100 ==0:
            if year % 400 ==0:
                isLeapYear = True
            else:
                isLeapYear = False
        else:
            isLeapYear = True      
    else:
        isLeapYear = False      #注意是一个等号还是两个等号
    return isLeapYear

def calendar(y, m): #打印y年m月日历
    print('       {}年{}月'.format(y,m))
    print('Su\tM\tTu\tW\tTh\tF\tSa')
    # 请在下面编写代码
    # ********** Begin ********** #
    month_1 = [1,3,5,7,8,10,12]
    month_2 = [4,6,9,11]
    momth_number = 0
    if isLeapYear(y):           #计算这个月有多少天
        if m == 2:
            month_number = 29
        else:
            if m in month_1:
                month_number = 31
            if m in month_2:
                month_number = 30
    else:
        if m == 2:
            month_number = 28
        else:
            if m in month_1:
                month_number = 31
            if m in month_2:
                month_number = 30 
                
    table = day(y, m, 1)       #空格     排列输出
    for j in range (1,month_number + 1):        #注意加一
        if j == 1:
            print("\t" * table,end = '')
        j = str(j)
        print(j + "\t",end = '')
        j = eval(j)
        if (j + day(y, m, 1)) % 7 == 0:
            print("\r")
    print("\r")
 
for (y,m) in [(2020,12), (2017,2), (2016,2)]:
        calendar(y, m)
        print('---------------------------')

三、我们来逐个fenxi
(1) day(y, m, d)函数
  这个函数没有什么实质性的技术含量,因为这里涉及到一个数学的问题,比如,直接用数学公式,下边我提供一下本函数用的三个数学公式:
在这里插入图片描述
  假如给定了y,m,d,则上边的d0就是要求的星期几。
  注意:星期日代表的数字是0,切记,但别问我咋知道的。
函数就这样出来了:

def day(y, m, d):
    y0 = y - (14 - m)//12
    x = y0 + y0//4 - y0//100 + y0 //400
    m0 = m + 12*((14 - m)//12) - 2
    d0 = (d + x + 31*m0//12) % 7
    return d0  

(2) disLeapYear(year)函数
  关于判断闰年这件事想必很好知晓,这里我提供一张流程结构图仅供参考:
在这里插入图片描述
  注意:1. 一定要晓得“=”和“ == ”的区别,唉,这都是前车之鉴啊;
  注意:2. 能被整除的条件可不是year // 4 = = 0, 而是year % 4 == 0,切记不要弄混;
  注意:3. Python里“/”和“//”有区别,前者为浮点数运算,后者为整数运算;
  注意:4. Python自带True和False关键字使用,再也不用写0和1进行判断了;
  注意:5. 在强调一下这里的代码风格,哪个该空格哪里该缩进,一定要做一个正规军。
函数也是这么出来了:

def isLeapYear(year): #判断year年是否闰年
   isLeapYear = True       
   if year % 4 ==0:       #整除可不是等于0,天
       if year % 100 ==0:
           if year % 400 ==0:
               isLeapYear = True
           else:
               isLeapYear = False
       else:
           isLeapYear = True      
   else:
       isLeapYear = False      #注意是一个等号还是两个等号
   return isLeapYear

(3) calendar(y, m)函数
在这里插入图片描述
  这里要解决两个问题,也就是本次程序的核心:
  1. 这个月有多少天?
  2. 怎么才能做到换行与星期几相对应?
不得不说第二个问题让我焦灼了好一会儿~
在这里插入图片描述
1 . 这个月有多少天?
  对于这一神来之问没有太多的压力,因为是不是闰年都已经判定好了,只需调用一下函数就可以断定这个月份是多少天,好吧,此外在这里科普一下,闰年的二月是29天,平年的二月是28天。
我需要强调的是:
  1. 月份有31天和30天的区别,这里我直接用两个列表(month_1和month_2)进行选择判断;
  2. 因为isLeapYear()函数返回值是True和False,所以在进行判断的时候我直接用了if isLeapYear(y): 意味着如果是闰年我要怎么着怎么着;
  3. 一定要记得二月这个特殊的月份,要单独进行一次判断;
  4. 注意我把月份的天数放在了一个名叫month_number的变量里,是不是一目了然?如果你还在用t, k, l之类的变量名,尽快向专业化迈进吧!
根据这些原理,我写出了这个月有多少天:

    month_1 = [1,3,5,7,8,10,12]
    month_2 = [4,6,9,11]
    momth_number = 0
    if isLeapYear(y):           #计算这个月有多少天
        if m == 2:
            month_number = 29
        else:
            if m in month_1:
                month_number = 31
            if m in month_2:
                month_number = 30
    else:
        if m == 2:
            month_number = 28
        else:
            if m in month_1:
                month_number = 31
            if m in month_2:
                month_number = 30

2 . 怎么才能做到换行与星期几相对应?
我们还把这个图重新放一边:
在这里插入图片描述
  还记得我说过周日对应的数字是0不?其实是那几个公式运行出来的结果,但正是这一结果,我突然发现了一个很重要的规律:
  星期是几,最开始的时候就有几个table

  这样的话我们还是分步来走:
  第一步我们把一个月的天数全部排成一条横线(这里就不展示了,想象一下),而这个横线的独特之处在于最开始的部分有几个table是不确定的,这里要解决两个问题:
1 . Python默认是换行打印,怎么才能不换行?———添加 end = “” 语句
2 . 怎么才能使行首的table确定下来呢?———添加“\t” * table (注意,代码里的table是我定义的一个变量,表示该月1号是周几),意味着是星期几,就有几个table
  第二步我们就开始考虑逢7换行的问题了,这里我采用取模运算,一下解决战斗。
所以有了下边的一串儿格式输出:

    table = day(y, m, 1)       #求空格数
    for j in range (1,month_number + 1):        #注意加一
        if j == 1:
            print("\t" * table,end = '')
        j = str(j)
        print(j + "\t",end = '')
        j = eval(j)
        if (j + day(y, m, 1)) % 7 == 0:
            print("\r")
    print("\r")

注意:
  1. range(a,b,c)函数可以用的很灵活,a表示起始,b表示终止,c表示步长,这里要记得终止条件是不包括那个数的,比如range(1, 10 ,1 ), 则只能到9;
  2. 逢7换行的时候如何与首行要添加的table互不干扰呢?这里我运用了一个信号量j, 当j等于1的时候说明是第一行,需要添加table,不等于1就不用加table了;
  3. 有时候要用数字判断,有时候要用字符串操作,怎么才能来回转换呢?str()函数使数字转为字符串,eval()函数使字符串转为数字;
  4.字符串连接要用“+”连接符;
  5. \t 和 \n 都有换行的意思,但具体效果如何,这里就不再多啰嗦了,亲自试试就知道啦。
四、最后奉上本次的运行结果

我知道不咋好看,不过那个啥,先将就着吧
在这里插入图片描述


最后是一道长长的结束线,连接着你和我……晚安!
在这里插入图片描述

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值