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使用新浪微博api上传图片到微博示例
Jan 10 Python
Python的设计模式编程入门指南
Apr 02 Python
Python通过正则表达式选取callback的方法
Jul 18 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
Apr 29 Python
使用python分析统计自己微信朋友的信息
Jul 19 Python
python类的实例化问题解决
Aug 31 Python
python实现小程序推送页面收录脚本
Apr 20 Python
Python JSON常用编解码方法代码实例
Sep 05 Python
使用Python获取字典键对应值的方法
Apr 26 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 日期时间函数的高级应用技巧
2009/10/10 PHP
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
PHP curl 抓取AJAX异步内容示例
2014/09/09 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
php实现微信公众号主动推送消息
2015/12/31 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
jQuery 仿百度输入标签插件附效果图
2014/07/04 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
微信小程序按钮点击动画效果的实现
2019/09/04 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
Python Web开发模板引擎优缺点总结
2014/05/06 Python
python传递参数方式小结
2015/04/17 Python
代码讲解Python对Windows服务进行监控
2018/02/11 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
厨房领班竞聘演讲稿
2014/04/23 职场文书
党员批评与自我批评材料
2014/10/14 职场文书
职位证明模板
2015/06/23 职场文书
社区安全温馨提示语
2015/07/14 职场文书
病房管理制度范本
2015/08/06 职场文书
Python中的变量与常量
2021/11/11 Python