Python例項教程之檢索輸出月份日曆表
一、題目要求與分析
根據輸入的年和月,列印該月的日曆。如圖所示:
題目分析:複雜的問題往往很簡單,只需要找到拆分點即可,就像這種題可以分為三個函式:
函式1: 計算並返回某年某月某日是星期幾;
函式2: 判斷某年是否是閏年;
函式3:列印所給年月的日曆.
emmm……這麼一分析可能會引起很多人若有所思,對的,你的現在的思路完全正確,之所以要判定某一個日子是星期幾是因為我們要知道每月的1號是周幾才行(注意找日曆的規律),那之所以要判定是否是閏年是因為有了二月份這一特殊的存在,最後之所以要列印,好吧,你不列印我怎麼看。
為了方便起見,我們在這裡直接把函式的名字給定一下:
函式1:day(y,m,d)——y為年,m為月,d為天
函式2: isLeapYear(year)——注意這種小駝峰的命名方式,一看就是正規軍
函式3:calendar(y,m)——列印,列印,這裡會遇到很多格式性問題
二、先看原始碼
純手工打造,你不喜歡看也不得行,今天你需要把它研究一波再走咯~
def day(y,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,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,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,d)函式
這個函式沒有什麼實質性的技術含量,因為這裡涉及到一個數學的問題,比如,直接用數學公式,下邊我提供一下本函式用的三個數學公式:
假如給定了y,d,則上邊的d0就是要求的星期幾。
注意:星期日代表的數字是0,切記,但別問我咋知道的。
函式就這樣出來了:
def day(y,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)函式
關於判斷閏年這件事想必很好知曉,這裡我提供一張流程結構圖僅供參考:
注意: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)函式
這裡要解決兩個問題,也就是本次程式的核心:
1. 這個月有多少天?
2. 怎麼才能做到換行與星期幾相對應?
不得不說第二個問題讓我焦灼了好一會兒~
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 . 怎麼才能做到換行與星期幾相對應?
我們還把這個圖重新放一邊:
還記得我說過週日對應的數字是0不?其實是那幾個公式執行出來的結果,但正是這一結果,我突然發現了一個很重要的規律:
星期是幾,最開始的時候就有幾個table
這樣的話我們還是分步來走:
第一步我們把一個月的天數全部排成一條橫線(這裡就不展示了,想象一下),而這個橫線的獨特之處在於最開始的部分有幾個table是不確定的,這裡要解決兩個問題:
1 . Python預設是換行列印,怎麼才能不換行?———新增 end = “” 語句
2 . 怎麼才能使行首的table確定下來呢?———新增“\t” * table (注意,程式碼裡的table是我定義的一個變數,表示該月1號是周幾),意味著是星期幾,就有幾個table
第二步我們就開始考慮逢7換行的問題了,這裡我採用取模運算,一下解決戰鬥。
所以有了下邊的一串兒格式輸出:
table = day(y,1) #求空格數 for j in range (1,month_number + 1): #注意加一 if j == 1: print("\t" * table,1)) % 7 == 0: print("\r") print("\r")
注意:
1. range(a,b,c)函式可以用的很靈活,a表示起始,b表示終止,c表示步長,這裡要記得終止條件是不包括那個數的,比如range(1,1 ),則只能到9;
2. 逢7換行的時候如何與首行要新增的table互不干擾呢?這裡我運用了一個訊號量j, 當j等於1的時候說明是第一行,需要新增table,不等於1就不用加table了;
3. 有時候要用數字判斷,有時候要用字串操作,怎麼才能來回轉換呢?str()函式使數字轉為字串,eval()函式使字串轉為數字;
4.字串連線要用“+”連線符;
5. \t 和 \n 都有換行的意思,但具體效果如何,這裡就不再多囉嗦了,親自試試就知道啦。
四、最後奉上本次的執行結果
我知道不咋好看,不過那個啥,先將就著吧
到此這篇關於Python檢索輸出月份日曆表的文章就介紹到這了,更多相關Python檢索輸出月份日曆表內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!