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进行验证码识别的一些想法
Jan 25 Python
Python对list列表结构中的值进行去重的方法总结
May 07 Python
Python使用遗传算法解决最大流问题
Jan 29 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
Jul 23 Python
Django模型修改及数据迁移实现解析
Aug 01 Python
Python倒排索引之查找包含某主题或单词的文件
Nov 13 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
python scatter函数用法实例详解
Feb 11 Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 Python
python读写数据读写csv文件(pandas用法)
Dec 14 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学习笔记 用户注册模块用户类以及验证码类
2011/09/20 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
php中addslashes函数与sql防注入
2014/11/17 PHP
thinkPHP查询方式小结
2016/01/09 PHP
JavaScript窗口功能指南之在窗口中书写内容
2006/07/21 Javascript
php上传图片并给图片打上透明水印的代码
2010/06/07 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
2015/12/03 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
JS声明对象时属性名加引号与不加引号的问题及解决方法
2018/02/16 Javascript
小程序获取周围IBeacon设备的方法
2018/10/31 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
2018/11/20 Javascript
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
ubuntu安装mysql pycharm sublime
2018/02/20 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
python 字符串追加实例
2019/07/20 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
通过实例解析Python return运行原理
2020/03/04 Python
美国最大的团购网站:Groupon
2016/07/23 全球购物
一月红领巾广播稿
2014/02/11 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
人事任命书格式
2014/06/05 职场文书
学校教师安全责任书
2014/07/23 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
离婚财产处理协议书
2014/09/30 职场文书
爱国电影观后感
2015/06/19 职场文书