Python -- 萬年歷

萬年歷的主要難點:

  1. 算出當月一號是星期幾
  2. 格式化輸出字符串

思路:

  1. 先指定一個確定了星期幾的日期作為參考日期。比如1900/1/1 是星期一。
    然后將需要打印萬年歷的年月算出總天數(shù) -- 參考日期的總天數(shù) = 相差的天數(shù),
    對 7 取余,就能得到指定日期是星期幾了。算總天數(shù)的同時,需要用到 對閏年的判斷,和每個月天數(shù)的判斷,這就是題目提示為什么要算這兩個的原因。
  2. 格式化輸出字符串,因為默認的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個空格的字符串。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,307評論 0 17
  • Since Jan.26th,2016 1、ubuntu 下運行 python 的幾種方式 在 terminal...
    Rco閱讀 2,708評論 0 2
  • 不知何時 窗外的夏花開過這個沉寂的季節(jié); 不知何時 曾經(jīng)的書桌落上一層細細的塵土。 開始彷徨曾經(jīng)淺淺的微笑, 終將...
    晰約閱讀 175評論 0 1
  • 若果還能相遇我希望化為永恒。
    莊德坤閱讀 191評論 0 0
  • 開始接受必須要去面對的事情 如果偏執(zhí)是種病,那么我就已經(jīng)病入膏肓了,像癡呆癥一樣沒有煩惱,像狂躁癥一樣快樂,...
    王王王wen閱讀 462評論 0 0

友情鏈接更多精彩內(nèi)容