python新手練習(xí)實(shí)例之萬(wàn)年歷
一、題目描述
A:先輸出提示語(yǔ)句,并接受用戶(hù)輸入的年、月。
B:根據(jù)用戶(hù)輸入的年,先判斷是否是閏年。
C:根據(jù)用戶(hù)輸入的月來(lái)判斷月的天數(shù)。
D:用循環(huán)計(jì)算用戶(hù)輸入的年份距1900年1月1日的總天數(shù)。
E:用循環(huán)計(jì)算用戶(hù)輸入的月份距輸入的年份的1月1日共有多少天。
F:相加D與E的天數(shù),得到總天數(shù)。
G:用總天數(shù)來(lái)計(jì)算輸入月的第一天的星期數(shù)。
H:根據(jù)G的值,格式化輸出這個(gè)月的日歷!
二、解析
1、分析
根據(jù)題目的八個(gè)要求,可以看出有些功能是重復(fù)或者說(shuō)需要相互調(diào)用的,所以可以用模塊的思想將每個(gè)要求封裝成函數(shù);
2、功能
①判斷是否是閏年函數(shù)
根據(jù)閏年的判斷規(guī)則,如果年是4的倍數(shù),但不是100的倍數(shù)則是閏年或者是400的整數(shù)倍也是閏年,所以函數(shù)需要傳入一個(gè)參數(shù)(年份)
#判斷閏年 def B(year): if year % 4 == 0 and year % 100 != 0 or year % 400 == 0: return True return False
②判斷輸入月的天數(shù)的函數(shù)
除了2月份會(huì)根據(jù)平年和閏年發(fā)生變化以外, 每月的天數(shù)是已經(jīng)確定好的;所以此時(shí)需要調(diào)用已經(jīng)定義好的判斷閏年的函數(shù)才能確定二月的天數(shù);所以函數(shù)需要傳入兩個(gè)參數(shù)(月份和年份)
此時(shí)有兩個(gè)小技巧,一個(gè)是判斷月份是那月,最開(kāi)始用的是用相等加上or去判斷是否滿(mǎn)足條件,其實(shí)可以將大月或者小月的月份寫(xiě)到一個(gè)列表中,然后再通過(guò)in去判斷;第二個(gè)是在確定天數(shù)時(shí),可以先定義好一個(gè)常用值,然后根據(jù)月份去修改其值,最后返回常用值即可,這樣就少了幾行的賦值以及返回的代碼
def C(year,month): days = 31 #31天居多,設(shè)置為默認(rèn)值 if month == 2 : #2月份要判斷是否是閏年 if B(year): days=29 else: days=28; elif month in [4,6,9,11]: #判斷小月,只有30天 days=30 return days
③計(jì)算年份距離1900的總天數(shù)的函數(shù)
因?yàn)槠侥旮c年的天數(shù)不一樣,所以要調(diào)用判斷閏年的函數(shù),確定其一年的總天數(shù);
總天數(shù)也就是相當(dāng)于求每年的天數(shù)之和即可;所以需要去遍歷每年的天數(shù)求其總和即為結(jié)果;所以函數(shù)需要傳入一個(gè)參數(shù)(年份)
#某年到1900年的天數(shù) def D(year:int): day = 0 for i in range(1900,year): if B(i): day +=366 else: day +=365 return day
④ 月份距離1月1日的天數(shù)的函數(shù)
距離1月1日的天數(shù)也就是每月天數(shù)的總和,此時(shí)就先需要確定其每月的天數(shù),也就是需要調(diào)用之前定義的函數(shù),還需要知道的是其年份判斷是否閏年,所以函數(shù)需要傳入兩個(gè)參數(shù)(年份和月份)
遍歷每月的天數(shù)(通過(guò)調(diào)用函數(shù)而來(lái)),然后將其求和,得到的就是需要的結(jié)果
#某月到1月1號(hào)的天數(shù) def E(year:int,month:int): days = 0 for i in range(1,month): days += C(year,i) return days
⑤確定星期幾的函數(shù)
首先通過(guò)調(diào)用求年份距離的天數(shù)和月份的天數(shù)得到其天數(shù)總和,所以函數(shù)需要傳入兩個(gè)參數(shù)(月份和年份)
然后將總和加一(因?yàn)榈玫降氖窃路?,而算天?shù)時(shí)要獎(jiǎng)當(dāng)日計(jì)算再內(nèi)),然后對(duì)7求余即為星期幾
#確定星期幾 def G(year:int,month:int): total_day = D(year) + E(year,month) + 1 week = total_day % 7 return week
⑥格式化輸出日歷函數(shù)
輸出有兩種格式,一種是星期日在第一天,一種是星期日在最后一天;
第一種方式:星期日在第一天,根據(jù)得到的星期幾函數(shù)(也就是當(dāng)月1號(hào)的星期幾函數(shù)),可以確定第一天的位置(也就是1的位置);
日歷也就是輸出1到總天數(shù)(根據(jù)月份確定)在對(duì)應(yīng)的位置(星期幾),由于1號(hào)的位置已經(jīng)確定,而一號(hào)前面的則為空,所以單獨(dú)遍歷輸出空格,然后再輸出日歷;
一周對(duì)應(yīng)的是七天,也就是每七天進(jìn)行一次換行,所以還需要定義一個(gè)計(jì)數(shù)器
第二種方式:也就是星期日在最后一天,其他邏輯都是一樣的,只是在確定1號(hào)的位置不一樣;
本來(lái)周日的位置為第一個(gè),但是現(xiàn)在變成了最后一個(gè),也就是位置向后移了6位,所以只需要計(jì)算位置的時(shí)候先將其加上,然后再求余即可
#格式化輸出 def my_print(total:int): # iCount = 0 # print("日\(chéng)t一\t二\t三\t四\t五\t六") # for i in range((G(year, month) % 7)): # print(end='\t') # iCount += 1 # for i in range(1, C(year, month) + 1): # print(i, end='\t') # iCount += 1 # if iCount % 7 == 0: # print('') iCount = 0 print('一\t二\t三\t四\t五\t六\t日\(chéng)t') for i in range(((G(year,month) + 6) % 7)): print(end='\t') iCount +=1 for i in range(1,C(year,month) + 1): print(i,end='\t') iCount +=1 if iCount % 7 == 0: print('')
三、源碼
# -*- coding: utf-8 -*- from datetime import date import calendar # def B(year): # if year/4==0 and year/400 !=0: # return True # elif year/100 == 0 and year/400 ==0 : # return True # else: # return False #判斷閏年 def B(year): if year % 4 == 0 and year % 100 != 0 or year % 400 == 0: return True return False # def C(year:int,month:int): # days = 30 # if month in [1,3,5,7,8,10,12]: # days = 31 # elif month == 2: # if B(year): # days = 29 # else: # days = 28 # return days #每月的天數(shù) def C(year,month): days = 31 #31天居多,設(shè)置為默認(rèn)值 if month == 2 : #2月份要判斷是否是閏年 if B(year): days=29 else: days=28; elif month in [4,6,9,11]: #判斷小月,只有30天 days=30 return days #某年到1900年的天數(shù) def D(year:int): day = 0 for i in range(1900,year): if B(i): day +=366 else: day +=365 return day #某月到1月1號(hào)的天數(shù) def E(year:int,month:int): days = 0 for i in range(1,month): days += C(year,i) return days #確定星期幾 def G(year:int,month:int): total_day = D(year) + E(year,month) + 1 week = total_day % 7 return week #格式化輸出 def my_print(total:int): # iCount = 0 # print("日\(chéng)t一\t二\t三\t四\t五\t六") # for i in range((G(year, month) % 7)): # print(end='\t') # iCount += 1 # for i in range(1, C(year, month) + 1): # print(i, end='\t') # iCount += 1 # if iCount % 7 == 0: # print('') iCount = 0 print('一\t二\t三\t四\t五\t六\t日\(chéng)t') for i in range(((G(year,month) + 6) % 7)): print(end='\t') iCount +=1 for i in range(1,C(year,month) + 1): print(i,end='\t') iCount +=1 if iCount % 7 == 0: print('') if __name__ == '__main__': year = int(input('請(qǐng)輸入年:')) month = int(input('請(qǐng)輸入月')) my_print(G(year,month))
四、經(jīng)驗(yàn)
因?yàn)楹瘮?shù)多,而且計(jì)算的結(jié)果不方便去口頭的驗(yàn)算其結(jié)果,也就是說(shuō)當(dāng)結(jié)果不對(duì)時(shí)不知道是那出現(xiàn)的問(wèn)題時(shí),系統(tǒng)提供的
from datetime import date import calendar
兩個(gè)模塊中有方法可以得出其天數(shù)以及星期幾的結(jié)果,這樣就可以查找到底是哪一步出現(xiàn)的問(wèn)題了;也可以通過(guò)print去驗(yàn)證單個(gè)的函數(shù)是否正確;
總結(jié)
到此這篇關(guān)于python新手練習(xí)實(shí)例之萬(wàn)年歷的文章就介紹到這了,更多相關(guān)python實(shí)現(xiàn)萬(wàn)年歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python將dict中的unicode打印成中文實(shí)例
這篇文章主要介紹了python將dict中的unicode打印成中文實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05使用Python對(duì)文件進(jìn)行批量改名的方法
這篇文章主要介紹了使用Python對(duì)文件進(jìn)行批量改名的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03利用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)易的截圖工具
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)易的截圖工具,可以截完圖之后顯示并且永遠(yuǎn)前置,感興趣的小伙伴可以嘗試一下2022-07-07Jupyter Lab無(wú)法打開(kāi)終端窗口的解決方法
本文主要介紹了Jupyter Lab無(wú)法打開(kāi)終端窗口的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Python利用pyreadline模塊實(shí)現(xiàn)交互式命令行開(kāi)發(fā)
交互式命令行是一種方便用戶(hù)進(jìn)行交互的工具,能夠使用戶(hù)與計(jì)算機(jī)進(jìn)行快速的交互操作,提高工作效率。本文主要介紹了如何利用pyreadline模塊實(shí)現(xiàn)交互式命令行開(kāi)發(fā),需要的可以參考一下2023-05-05