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实现生成简单的Makefile文件代码示例
Mar 10 Python
Python 使用PIL中的resize进行缩放的实例讲解
Aug 03 Python
Python 打印中文字符的三种方法
Aug 14 Python
Python3爬虫使用Fidder实现APP爬取示例
Nov 27 Python
对python requests发送json格式数据的实例详解
Dec 19 Python
python多线程并发让两个LED同时亮的方法
Feb 18 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
python批量修改xml属性的实现方式
Mar 05 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 Python
JAVA SpringMVC实现自定义拦截器
Mar 16 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
请php正则走开
2008/03/15 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
jQuery 1.0.2
2006/10/11 Javascript
在js中使用"with"语句中跨frame的变量引用问题
2007/03/08 Javascript
javascript GUID生成器实现代码
2009/10/31 Javascript
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
基于jQuery实现下拉收缩(展开与折叠)特效
2012/12/25 Javascript
自定义jQuery选项卡插件实例
2013/03/27 Javascript
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
为jquery的ajax请求添加超时timeout时间的操作方法
2018/09/04 jQuery
小程序实现选择题选择效果
2018/11/04 Javascript
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
2020/12/05 Javascript
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
Python字符串转换成浮点数函数分享
2015/07/24 Python
Python 中的with关键字使用详解
2016/09/11 Python
python+selenium+autoit实现文件上传功能
2017/08/23 Python
python仿抖音表白神器
2019/04/08 Python
python操作gitlab API过程解析
2019/12/27 Python
虚拟机下载python是否需要联网
2020/07/27 Python
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
世界最大的票务市场:viagogo
2017/02/16 全球购物
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
旅游管理专业学生求职信
2013/09/28 职场文书
企业金融服务方案
2014/06/03 职场文书
英语辞职信范文
2015/02/28 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书