溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用Python怎么輸出一個月份日歷表

發(fā)布時間:2020-12-17 13:51:35 來源:億速云 閱讀:317 作者:Leah 欄目:開發(fā)技術

利用Python怎么輸出一個月份日歷表?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

一、題目要求與分析

根據(jù)輸入的年和月,打印該月的日歷。如圖所示:

利用Python怎么輸出一個月份日歷表

題目分析:復雜的問題往往很簡單,只需要找到拆分點即可,就像這種題可以分為三個函數(shù):

?? 函數(shù)1: 計算并返回某年某月某日是星期幾;

?? 函數(shù)2: 判斷某年是否是閏年;

?? 函數(shù)3:打印所給年月的日歷.

emmm……這么一分析可能會引起很多人若有所思,對的,你的現(xiàn)在的思路完全正確,之所以要判定某一個日子是星期幾是因為我們要知道每月的1號是周幾才行(注意找日歷的規(guī)律),那之所以要判定是否是閏年是因為有了二月份這一特殊的存在,最后之所以要打印,好吧,你不打印我怎么看。

為了方便起見,我們在這里直接把函數(shù)的名字給定一下:

??函數(shù)1:day(y, m, d)——y為年,m為月,d為天

??函數(shù)2: isLeapYear(year)——注意這種小駝峰的命名方式,一看就是正規(guī)軍

??函數(shù)3:calendar(y, m)——打印,打印,這里會遇到很多格式性問題

二、先看源代碼

純手工打造,你不喜歡看也不得行,今天你需要把它研究一波再走咯~

def day(y, m, 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, m, 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, m, 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, m, d)函數(shù)

這個函數(shù)沒有什么實質(zhì)性的技術含量,因為這里涉及到一個數(shù)學的問題,比如,直接用數(shù)學公式,下邊我提供一下本函數(shù)用的三個數(shù)學公式:

利用Python怎么輸出一個月份日歷表

假如給定了y,m,d,則上邊的d0就是要求的星期幾。

注意:星期日代表的數(shù)字是0,切記,但別問我咋知道的。

函數(shù)就這樣出來了:

def day(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

(2) disLeapYear(year)函數(shù)

關于判斷閏年這件事想必很好知曉,這里我提供一張流程結(jié)構(gòu)圖僅供參考:

利用Python怎么輸出一個月份日歷表

??注意:1. 一定要曉得“=”和“ == ”的區(qū)別,唉,這都是前車之鑒??;

??注意:2. 能被整除的條件可不是year // 4 = = 0, 而是year % 4 == 0,切記不要弄混;

??注意:3. Python里“/”和“//”有區(qū)別,前者為浮點數(shù)運算,后者為整數(shù)運算;

??注意:4. Python自帶True和False關鍵字使用,再也不用寫0和1進行判斷了;

??注意:5. 在強調(diào)一下這里的代碼風格,哪個該空格哪里該縮進,一定要做一個正規(guī)軍。

函數(shù)也是這么出來了:

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)函數(shù)

利用Python怎么輸出一個月份日歷表

這里要解決兩個問題,也就是本次程序的核心:

??1. 這個月有多少天?

??2. 怎么才能做到換行與星期幾相對應?

不得不說第二個問題讓我焦灼了好一會兒~

利用Python怎么輸出一個月份日歷表

1 . 這個月有多少天?

??對于這一神來之問沒有太多的壓力,因為是不是閏年都已經(jīng)判定好了,只需調(diào)用一下函數(shù)就可以斷定這個月份是多少天,好吧,此外在這里科普一下,閏年的二月是29天,平年的二月是28天。

我需要強調(diào)的是:

??1. 月份有31天和30天的區(qū)別,這里我直接用兩個列表(month_1和month_2)進行選擇判斷;

??2. 因為isLeapYear()函數(shù)返回值是True和False,所以在進行判斷的時候我直接用了if isLeapYear(y): 意味著如果是閏年我要怎么著怎么著;

??3. 一定要記得二月這個特殊的月份,要單獨進行一次判斷;

??4. 注意我把月份的天數(shù)放在了一個名叫month_number的變量里,是不是一目了然?如果你還在用t, k, l之類的變量名,盡快向?qū)I(yè)化邁進吧!

根據(jù)這些原理,我寫出了這個月有多少天:

2 . 怎么才能做到換行與星期幾相對應?

我們還把這個圖重新放一邊:

利用Python怎么輸出一個月份日歷表

??還記得我說過周日對應的數(shù)字是0不?其實是那幾個公式運行出來的結(jié)果,但正是這一結(jié)果,我突然發(fā)現(xiàn)了一個很重要的規(guī)律:

??星期是幾,最開始的時候就有幾個table

??這樣的話我們還是分步來走:

??第一步我們把一個月的天數(shù)全部排成一條橫線(這里就不展示了,想象一下),而這個橫線的獨特之處在于最開始的部分有幾個table是不確定的,這里要解決兩個問題:

1 . Python默認是換行打印,怎么才能不換行?———添加 end = “” 語句

2 . 怎么才能使行首的table確定下來呢?———添加“\t” * table (注意,代碼里的table是我定義的一個變量,表示該月1號是周幾),意味著是星期幾,就有幾個table

第二步我們就開始考慮逢7換行的問題了,這里我采用取模運算,一下解決戰(zhàn)斗。

所以有了下邊的一串兒格式輸出:

 table = day(y, m, 1) #求空格數(shù)
 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, m, 1)) % 7 == 0:
  print("\r")
 print("\r")

注意:

??1. range(a,b,c)函數(shù)可以用的很靈活,a表示起始,b表示終止,c表示步長,這里要記得終止條件是不包括那個數(shù)的,比如range(1, 10 ,1 ), 則只能到9;

??2. 逢7換行的時候如何與首行要添加的table互不干擾呢?這里我運用了一個信號量j, 當j等于1的時候說明是第一行,需要添加table,不等于1就不用加table了;

??3. 有時候要用數(shù)字判斷,有時候要用字符串操作,怎么才能來回轉(zhuǎn)換呢?str()函數(shù)使數(shù)字轉(zhuǎn)為字符串,eval()函數(shù)使字符串轉(zhuǎn)為數(shù)字;

??4.字符串連接要用“+”連接符;

??5. \t 和 \n 都有換行的意思,但具體效果如何,這里就不再多啰嗦了,親自試試就知道啦。

四、最后奉上本次的運行結(jié)果

我知道不咋好看,不過那個啥,先將就著吧

利用Python怎么輸出一個月份日歷表

關于利用Python怎么輸出一個月份日歷表問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業(yè)資訊頻道了解更多相關知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI