【纯文本教程】大学专科的Python基础开发课——【实训项目】打印某年日历
用Python打印某年日历
项目目标:
日历程序可以打印出任何一年的日历,程序运行后输入一个年份,例如2017,或者是2020,打印出全年的日历,示例可以参考Windows操作系统自带的日历。
项目设计(思路):
第一步,闰年的判断
【常识·闰年的定义】判断年份y是否是闰年,需要满足两个条件之一:
(这里有一个没有明说的前提条件——“闰年”是在“公元元年”之后,而“公元前”的年份不参与闰年、平年的判断;就像“质数”与“合数”是在大于1的正整数中一样。当然,公历的年份默认是整数就不说了。)
一是400的正整数倍数
二是4的正整数倍数中的非整百数
这里再强调一遍“闰年判断函数”
def isLeap(y):
return y%400==0 or y%4==0 and y%100!=0#在这里面,“and”的优先级要高于“or”,因此是先计算后面的“and”,再计算前面的“or”。
第二步,某月最大天数的判断
【常识·历法·公历】某个月份的最大天数:
大月(1、3、5、7、8、10、12)是31天;
2月特殊(平年28天,闰年29天)
设计“最大天数判断函数”(返回y年m月的最大天数)
def maxDays(y,m):
if m==1 or m==3 or m==5 or m==7 or m==8 or m==10 or m==12:
d = 31
elif m==2:
d = 29 if isLeap(y) else 28
return d
第三步,判断某月1日是星期几
计算y年m月d日是当年的第几天,然后才能够配合星期,正确显示
def countDays(y,m,d):
days = d
if m>=2:
days+=31
if m>=3:
days+=29 if isLeap(y) else 28
if m>=4:
days+=31
if m>=5:
days+=30
if m>=6:
days+=31
if m>=7:
days+=30
if m>=8:
days+=31
if m>=9:
days+=31
if m>=10:
days+=30
if m>=11:
days+=31
if m>=12:
days+=30
return days
m=5的时候,就累加前4个月的天数——31+(28 or 29)+31+30
关于某天是星期几,有一个公式:((y-1)+(y+1)//400+(y-1)//4-(y-1)//100+countDays(y,m,1))%7,除以七取余数,就能够知道这一天是星期几;然后再进行设置——为了省事儿,0是星期日(余数是几,就对应星期几)。
def countWeek(y,m):#计算y年的元旦是星期几
w = ((y-1)+(y+1)//400+(y-1)//4-(y-1)//100+countDays(y,m,1))
return w%7
第四步,打印1月的日历/打印一个月的日历?
设计每个日期占输出宽度6个字符,一个“单元”是6个位置,则7个日期占42字符宽度,计算y年m月1日是星期w,然后通过:
for i in range(w):
print(“%-6s”%d,end=””)
#显示w个空“单元”,然后使用
for d in range(1,md+1):#这个“md”是什么?
print(“%-6s”%d,end=””)
w = w + 1
if w%7 == 0:
print()#当w是7的倍数的时候,换行,打印下一个星期(哎?等等,不是设置了0到6了吗,为什么会有7?)
第五步,打印当年的日历——最终代码
必须要先正确打印1月的日历,然后才能够正确打印每个月的日历。
完整代码如下:
'''
程序用途:【实训项目】打印某年日历
编写日期:2020年5月6日
所需知识:Python流程控制、Python函数
'''
def isLeap(y):#第一个函数是闰年判断
return y%400==0 or y%4==0 and y%100!=0
def maxDays(y,m):#第二个函数是判断每个月的最大天数
d = 30
if m == 1 or m == 3 or m == 5 or m == 7 or m == 8 or m == 10 or m == 12:
d = 31
elif m == 2:
d == 29 if isLeap(y) else 28
return d
def countDays(y,m,d):#第三个函数是判断星期几
days = d
if m>=2:
days+=31
if m>=3:
days+=29 if isLeap(y) else 28
if m>=4:
days+=31
if m>=5:
days+=30
if m>=6:
days+=31
if m>=7:
days+=30
if m>=8:
days+=31
if m>=9:
days+=31
if m>=10:
days+=30
if m>=11:
days+=31
if m>=12:
days+=30
return days
def countWeek(y,m):# 第四个函数是计算y年的元旦是星期几
w = ((y-1)+(y+1)//400+(y-1)//4-(y-1)//100+countDays(y,m,1))
return w%7
def printMonth(y,m):# 第五个函数是逐月显示
w = countWeek(y,m)
md = maxDays(y,m)
print("%-6s%-6s%-6s%-6s%-6s%-6s%-6s" % ("Sun","Mon","Tue","Wed","Thu","Fri","Sat"))
for i in range(w):
print("%-6s" % "", end="")
for d in range(1, md+1):
print("%-6d" % d, end="")
w = w + 1
if w % 7 == 0:
print()
#自定义函数到此结束,然后进入主程序
y = int(input("输入年份:"))
for m in range(1, 13):#从1月份打印到12月份
print()
print("--------------",y,"年",m,"月--------------")
printMonth(y, m)
print()
本页面属于系列“【纯文本教程】大学专科的Python基础开发课”里面的第一个相对完整的项目,此系列的其它网页,我还在对Word版课堂笔记进行校对,敬请期待!
“Python基础开发”算是本人大二第二学期最重要的一门课程了,课程表上是2020年4月21日~6月12日学习理论知识,2020年6月15日~7月3日进行“校内集中实训”。