用Python打印某年日历


【纯文本教程】大学专科的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日进行“校内集中实训”。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM