【純文本教程】大學專科的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日進行“校內集中實訓”。