Python实例教程之检索输出月份日历表


Posted in Python onDecember 16, 2020

一、题目要求与分析

根据输入的年和月,打印该月的日历。如图所示:

Python实例教程之检索输出月份日历表

题目分析:复杂的问题往往很简单,只需要找到拆分点即可,就像这种题可以分为三个函数:

   函数1: 计算并返回某年某月某日是星期几;

   函数2: 判断某年是否是闰年;

   函数3:打印所给年月的日历.

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

Python实例教程之检索输出月份日历表

为了方便起见,我们在这里直接把函数的名字给定一下:

  函数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)函数

这个函数没有什么实质性的技术含量,因为这里涉及到一个数学的问题,比如,直接用数学公式,下边我提供一下本函数用的三个数学公式:

Python实例教程之检索输出月份日历表

假如给定了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)函数

关于判断闰年这件事想必很好知晓,这里我提供一张流程结构图仅供参考:

Python实例教程之检索输出月份日历表

  注意: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)函数

Python实例教程之检索输出月份日历表

这里要解决两个问题,也就是本次程序的核心:

  1. 这个月有多少天?

  2. 怎么才能做到换行与星期几相对应?

不得不说第二个问题让我焦灼了好一会儿~

Python实例教程之检索输出月份日历表

1 . 这个月有多少天?

  对于这一神来之问没有太多的压力,因为是不是闰年都已经判定好了,只需调用一下函数就可以断定这个月份是多少天,好吧,此外在这里科普一下,闰年的二月是29天,平年的二月是28天。

我需要强调的是:

  1. 月份有31天和30天的区别,这里我直接用两个列表(month_1和month_2)进行选择判断;

  2. 因为isLeapYear()函数返回值是True和False,所以在进行判断的时候我直接用了if isLeapYear(y): 意味着如果是闰年我要怎么着怎么着;

  3. 一定要记得二月这个特殊的月份,要单独进行一次判断;

  4. 注意我把月份的天数放在了一个名叫month_number的变量里,是不是一目了然?如果你还在用t, k, l之类的变量名,尽快向专业化迈进吧!

根据这些原理,我写出了这个月有多少天:

2 . 怎么才能做到换行与星期几相对应?

我们还把这个图重新放一边:

Python实例教程之检索输出月份日历表

  还记得我说过周日对应的数字是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 都有换行的意思,但具体效果如何,这里就不再多??铝耍?鬃允允跃椭?览病?/p>

四、最后奉上本次的运行结果

我知道不咋好看,不过那个啥,先将就着吧

Python实例教程之检索输出月份日历表

到此这篇关于Python检索输出月份日历表的文章就介绍到这了,更多相关Python检索输出月份日历表内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python uuid模块使用实例
Apr 08 Python
Python内建数据结构详解
Feb 03 Python
python pandas 如何替换某列的一个值
Jun 09 Python
python re正则匹配网页中图片url地址的方法
Dec 20 Python
Python编写带选项的命令行程序方法
Aug 13 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
Python Tkinter Entry和Text的添加与使用详解
Mar 04 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
python实现超级玛丽游戏
Mar 18 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
Apr 27 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 Python
Python 解决空列表.append() 输出为None的问题
May 23 Python
使用Python判断一个文件是否被占用的方法教程
Dec 16 #Python
python中类与对象之间的关系详解
Dec 16 #Python
python简单实现插入排序实例代码
Dec 16 #Python
python中函数返回多个结果的实例方法
Dec 16 #Python
python的setattr函数实例用法
Dec 16 #Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 #Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
Dec 16 #Python
You might like
初学者入门:细述PHP4的核心Zend
2006/09/05 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
2013/06/05 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
单台服务器的PHP进程之间实现共享内存的方法
2014/06/13 PHP
PHP连接MSSQL方法汇总
2016/02/05 PHP
跨浏览器的事件对象介绍
2012/06/27 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
2013/10/17 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
[01:28]一分钟告诉你DOTA2 TI9不朽宝藏Ⅱ中有什么!
2019/07/09 DOTA
python函数返回多个值的示例方法
2013/12/04 Python
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
python插入排序算法实例分析
2015/07/03 Python
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
thinkphp5 路由分发原理
2021/03/18 PHP
CSS去掉A标签(链接)虚线框的方法
2014/04/01 HTML / CSS
PHP如何调用MYSQL存储过程
2014/05/30 面试题
2013年高中生自我评价
2013/10/23 职场文书
动物科学专业毕业生的自我评价
2013/11/29 职场文书
致短跑运动员广播稿
2014/01/09 职场文书
员工考核评语大全
2014/04/26 职场文书
校园活动策划方案
2014/06/13 职场文书
医院科室评语
2015/01/04 职场文书
银行招聘自荐信
2015/03/06 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书
2019年特色火锅店的创业计划书模板
2019/08/28 职场文书
Redis Stream类型的使用详解
2021/11/11 Redis