Python實(shí)例教程之檢索輸出月份日歷表
一、題目要求與分析
根據(jù)輸入的年和月,打印該月的日歷。如圖所示:
題目分析:復(fù)雜的問題往往很簡單,只需要找到拆分點(diǎn)即可,就像這種題可以分為三個(gè)函數(shù):
函數(shù)1: 計(jì)算并返回某年某月某日是星期幾;
函數(shù)2: 判斷某年是否是閏年;
函數(shù)3:打印所給年月的日歷.
emmm……這么一分析可能會引起很多人若有所思,對的,你的現(xiàn)在的思路完全正確,之所以要判定某一個(gè)日子是星期幾是因?yàn)槲覀円烂吭碌?號是周幾才行(注意找日歷的規(guī)律),那之所以要判定是否是閏年是因?yàn)橛辛硕路葸@一特殊的存在,最后之所以要打印,好吧,你不打印我怎么看。
為了方便起見,我們在這里直接把函數(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):#計(jì)算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 #注意是一個(gè)等號還是兩個(gè)等號 return isLeapYear def calendar(y, m): #打印y年m月日歷 print(' {}年{}月'.format(y,m)) print('Su\tM\tTu\tW\tTh\tF\tSa') # 請?jiān)谙旅婢帉懘a # ********** Begin ********** # month_1 = [1,3,5,7,8,10,12] month_2 = [4,6,9,11] momth_number = 0 if isLeapYear(y): #計(jì)算這個(gè)月有多少天 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('---------------------------')
三、我們來逐個(gè)fenxi
(1) day(y, m, d)函數(shù)
這個(gè)函數(shù)沒有什么實(shí)質(zhì)性的技術(shù)含量,因?yàn)檫@里涉及到一個(gè)數(shù)學(xué)的問題,比如,直接用數(shù)學(xué)公式,下邊我提供一下本函數(shù)用的三個(gè)數(shù)學(xué)公式:
假如給定了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ù)
關(guān)于判斷閏年這件事想必很好知曉,這里我提供一張流程結(jié)構(gòu)圖僅供參考:
注意:1. 一定要曉得“=”和“ == ”的區(qū)別,唉,這都是前車之鑒?。?/p>
注意:2. 能被整除的條件可不是year // 4 = = 0, 而是year % 4 == 0,切記不要弄混;
注意:3. Python里“/”和“//”有區(qū)別,前者為浮點(diǎn)數(shù)運(yùn)算,后者為整數(shù)運(yùn)算;
注意:4. Python自帶True和False關(guān)鍵字使用,再也不用寫0和1進(jìn)行判斷了;
注意:5. 在強(qiáng)調(diào)一下這里的代碼風(fēng)格,哪個(gè)該空格哪里該縮進(jìn),一定要做一個(gè)正規(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 #注意是一個(gè)等號還是兩個(gè)等號 return isLeapYear
(3) calendar(y, m)函數(shù)
這里要解決兩個(gè)問題,也就是本次程序的核心:
1. 這個(gè)月有多少天?
2. 怎么才能做到換行與星期幾相對應(yīng)?
不得不說第二個(gè)問題讓我焦灼了好一會兒~
1 . 這個(gè)月有多少天?
對于這一神來之問沒有太多的壓力,因?yàn)槭遣皇情c年都已經(jīng)判定好了,只需調(diào)用一下函數(shù)就可以斷定這個(gè)月份是多少天,好吧,此外在這里科普一下,閏年的二月是29天,平年的二月是28天。
我需要強(qiáng)調(diào)的是:
1. 月份有31天和30天的區(qū)別,這里我直接用兩個(gè)列表(month_1和month_2)進(jìn)行選擇判斷;
2. 因?yàn)閕sLeapYear()函數(shù)返回值是True和False,所以在進(jìn)行判斷的時(shí)候我直接用了if isLeapYear(y): 意味著如果是閏年我要怎么著怎么著;
3. 一定要記得二月這個(gè)特殊的月份,要單獨(dú)進(jìn)行一次判斷;
4. 注意我把月份的天數(shù)放在了一個(gè)名叫month_number的變量里,是不是一目了然?如果你還在用t, k, l之類的變量名,盡快向?qū)I(yè)化邁進(jìn)吧!
根據(jù)這些原理,我寫出了這個(gè)月有多少天:
2 . 怎么才能做到換行與星期幾相對應(yīng)?
我們還把這個(gè)圖重新放一邊:
還記得我說過周日對應(yīng)的數(shù)字是0不?其實(shí)是那幾個(gè)公式運(yùn)行出來的結(jié)果,但正是這一結(jié)果,我突然發(fā)現(xiàn)了一個(gè)很重要的規(guī)律:
星期是幾,最開始的時(shí)候就有幾個(gè)table
這樣的話我們還是分步來走:
第一步我們把一個(gè)月的天數(shù)全部排成一條橫線(這里就不展示了,想象一下),而這個(gè)橫線的獨(dú)特之處在于最開始的部分有幾個(gè)table是不確定的,這里要解決兩個(gè)問題:
1 . Python默認(rèn)是換行打印,怎么才能不換行?———添加 end = “” 語句
2 . 怎么才能使行首的table確定下來呢?———添加“\t” * table (注意,代碼里的table是我定義的一個(gè)變量,表示該月1號是周幾),意味著是星期幾,就有幾個(gè)table
第二步我們就開始考慮逢7換行的問題了,這里我采用取模運(yùn)算,一下解決戰(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表示步長,這里要記得終止條件是不包括那個(gè)數(shù)的,比如range(1, 10 ,1 ), 則只能到9;
2. 逢7換行的時(shí)候如何與首行要添加的table互不干擾呢?這里我運(yùn)用了一個(gè)信號量j, 當(dāng)j等于1的時(shí)候說明是第一行,需要添加table,不等于1就不用加table了;
3. 有時(shí)候要用數(shù)字判斷,有時(shí)候要用字符串操作,怎么才能來回轉(zhuǎn)換呢?str()函數(shù)使數(shù)字轉(zhuǎn)為字符串,eval()函數(shù)使字符串轉(zhuǎn)為數(shù)字;
4.字符串連接要用“+”連接符;
5. \t 和 \n 都有換行的意思,但具體效果如何,這里就不再多啰嗦了,親自試試就知道啦。
四、最后奉上本次的運(yùn)行結(jié)果
我知道不咋好看,不過那個(gè)啥,先將就著吧
到此這篇關(guān)于Python檢索輸出月份日歷表的文章就介紹到這了,更多相關(guān)Python檢索輸出月份日歷表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python2和Python3中print的用法示例總結(jié)
在Python 3中接觸的第一個(gè)很大的差異就是縮進(jìn)是作為語法的一部分,這和C++等其他語言確實(shí)很不一樣,所以要小心,其中python3和python2中print的用法有很多不同,這篇文章主要給大家介紹了關(guān)于Python2和Python3中print用法的相關(guān)資料,需要的朋友可以參考下。2017-10-10python如何實(shí)現(xiàn)excel數(shù)據(jù)添加到mongodb
本文介紹了python是如何實(shí)現(xiàn)excel數(shù)據(jù)添加到mongodb,為了將數(shù)據(jù)導(dǎo)入mongodb,引入了pymongo,xlrd包,需要的朋友可以參考下2015-07-07解決Python中的ModuleNotFoundError:?No?module?named?'pad
你是否在嘗試導(dǎo)入`paddle`模塊時(shí)遇到了"ModuleNotFoundError:?No?module?named?'paddle'"這個(gè)錯(cuò)誤?別擔(dān)心,我們的指南會告訴你如何解決,這就像找到丟失的鑰匙一樣簡單,讓我們一起來看看如何解決這個(gè)問題吧!2024-03-03Python自動(dòng)化辦公之圖片轉(zhuǎn)PDF的實(shí)現(xiàn)
實(shí)現(xiàn)圖片轉(zhuǎn)換成PDF文檔的操作方法有很多,綜合對比以后感覺fpdf這個(gè)模塊用起來比較方便而且代碼量相當(dāng)少。所以本文將利用Python語言實(shí)現(xiàn)圖片轉(zhuǎn)PDF,感興趣的可以了解一下2022-04-04解決python 在for循環(huán)并且pop數(shù)組的時(shí)候會跳過某些元素的問題
這篇文章主要介紹了解決python 在for循環(huán)并且pop數(shù)組的時(shí)候會跳過某些元素的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12Python中使用攝像頭實(shí)現(xiàn)簡單的延時(shí)攝影技術(shù)
這篇文章主要介紹了Python中使用攝像頭實(shí)現(xiàn)簡單的延時(shí)攝影技術(shù),本文只是一個(gè)簡單的小示例,講解了實(shí)現(xiàn)過程并給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-03-03