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 14 Python
Python入门篇之列表和元组
Oct 17 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
Mar 13 Python
python 动态生成变量名以及动态获取变量的变量名方法
Jan 20 Python
python 实现在tkinter中动态显示label图片的方法
Jun 13 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
python 如何去除字符串头尾的多余符号
Nov 19 Python
解决python脚本中error: unrecognized arguments: True错误
Apr 20 Python
python与js主要区别点总结
Sep 13 Python
Python内置函数及功能简介汇总
Oct 13 Python
Python3 用什么IDE开发工具比较好
Nov 28 Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 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/27 PHP
php版本的cron定时任务执行器使用实例
2014/08/19 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
超级强大的表单验证
2006/06/26 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
jQuery为iframe的body添加click事件的实现代码
2011/04/07 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
使用JavaScript中的lodash编写双色球效果
2018/06/24 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
在小程序开发中使用npm的方法
2018/10/17 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
Python中编写ORM框架的入门指引
2015/04/29 Python
python中global用法实例分析
2015/04/30 Python
Python os模块学习笔记
2015/06/21 Python
Python简单连接MongoDB数据库的方法
2016/03/15 Python
Python实现自动添加脚本头信息的示例代码
2016/09/02 Python
python cumsum函数的具体使用
2019/07/29 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
Python3 集合set入门基础
2020/02/10 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
英语专业毕业生求职简历的自我评价
2013/10/24 职场文书
领导视察欢迎词
2014/01/15 职场文书
我的梦想演讲稿
2014/04/30 职场文书
运动会口号16字
2014/06/07 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏