萬年歷的主要難點:
- 算出當月一號是星期幾
- 格式化輸出字符串
思路:
- 先指定一個確定了星期幾的日期作為參考日期。比如1900/1/1 是星期一。
然后將需要打印萬年歷的年月算出總天數(shù) -- 參考日期的總天數(shù) = 相差的天數(shù),
對 7 取余,就能得到指定日期是星期幾了。算總天數(shù)的同時,需要用到 對閏年的判斷,和每個月天數(shù)的判斷,這就是題目提示為什么要算這兩個的原因。 - 格式化輸出字符串,因為默認的print每次打印都會換行,Python3 就可以用這個
print("%3d"%i,end=''),來不換行輸出字符。打印了七次再換行。還有就是用%3d控制打印字符的寬度,就可以對齊了,效果圖如下。

日歷.png
# -*- coding: utf-8 -*-
def is_leap_year(year):
if (year % 400 == 0 or year % 4 == 0 and year % 100 != 0):
return True
else:
return False
def count_leap_year(year): #算出當年之前的閏年的總個數(shù)
count = 0
for i in range(1, year + 1):
if is_leap_year(i):
count += 1
return count
def get_month_days(year, month): #算出當月的天數(shù)
if (is_leap_year(year)):
month_days = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
else:
month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
return month_days[month - 1]
def get_whatday(year, month): #參考的日期,1900年1月1號是星期一
base_days = 1900 * 365 + count_leap_year(1900) #算出1900/1/1的總天數(shù)
total_month_days = 0
for i in range(0, month - 1):
total_month_days += get_month_days(year, i) #算出當年前幾個月總天數(shù)
days = year * 365 + count_leap_year(year) + total_month_days + 1 #算出當年,當月1號的總天數(shù)
what_weekday = (days - base_days) % 7 #算出總天數(shù)的差值,對7取余數(shù),就能得到星期幾了
return what_weekday #當星期一時,返回值為1,星期日,返回值為0
def print_calendar(year,month):
print(" "*4,year,"年",month,"月")
print(" 日","一","二","三","四","五","六") #打印日歷頭部,漢字和逗號共占3個空格,“日”前加了個空格對齊
weekday = get_whatday(year,month)
spaces = " " #不打印日期時,使用3個空格代替
print("%s"%spaces * (weekday - 1),end='') #打印出第一行的日期,星號表示重復前面的字符串,重復次數(shù)為星號后的數(shù)
for i in range(1, get_month_days(year,month) + 1):
print("%3d"%i,end='') #拼接出日期字符串,每個日期占3格位置,來對齊。
if (((i - (7 - weekday + 1)) % 7) is 0): #每行打印7次,然后換下一行打印,7 - weekday + 1表示第二行開始的日期
print("")
if __name__ == '__main__':
year = int(input('year:'))
month = int(input('month:'))
print_calendar(year,month)
這次作業(yè)學到新知識, 主要就是Python3的格式化輸出字符串:
- 例如
print("%3d"%i,end=''),%3d 代表i占用3個格的位置輸出,可以統(tǒng)一不同位數(shù)的數(shù)字占用的位置 -
end = ""表示print輸出后不接任何字符,而默認是接換行符的,。而Python2是這樣print "",后面跟個逗號就不會換行,相比之下感覺還是Python3的end = ""的更加靈活。 -
" "*4,這個星號可以對前面的字符串重復拼接,而這個例子表示4個空格的字符串。