Python -- 万年历

万年历的主要难点:

  1. 算出当月一号是星期几
  2. 格式化输出字符串

思路:

  1. 先指定一个确定了星期几的日期作为参考日期。比如1900/1/1 是星期一。
    然后将需要打印万年历的年月算出总天数 -- 参考日期的总天数 = 相差的天数,
    对 7 取余,就能得到指定日期是星期几了。算总天数的同时,需要用到 对闰年的判断,和每个月天数的判断,这就是题目提示为什么要算这两个的原因。
  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):                                              #算出当年之前的闰年的总个数
    count = 0
    for i in range(1, year + 1):
        if is_leap_year(i):
            count += 1
    return count

def get_month_days(year, month):                                        #算出当月的天数
    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的总天数
    total_month_days = 0
    for i in range(0, month - 1):
        total_month_days += get_month_days(year, i)                      #算出当年前几个月总天数
    days = year * 365 + count_leap_year(year) + total_month_days + 1     #算出当年,当月1号的总天数
    what_weekday = (days - base_days) % 7                                #算出总天数的差值,对7取余数,就能得到星期几了
    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='')                            #打印出第一行的日期,星号表示重复前面的字符串,重复次数为星号后的数
    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)


这次作业学到新知识, 主要就是Python3的格式化输出字符串:

  • 例如print("%3d"%i,end='') ,%3d 代表 i占用3个格的位置输出,可以统一不同位数的数字占用的位置
  • end = ""表示print输出后不接任何字符,而默认是接换行符的,。而Python2是这样print "", 后面跟个逗号就不会换行,相比之下感觉还是Python3的end = ""的更加灵活。
  • " "*4 ,这个星号可以对前面的字符串重复拼接,而这个例子表示4个空格的字符串。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,861评论 0 17
  • Since Jan.26th,2016 1、ubuntu 下运行 python 的几种方式 在 terminal...
    Rco阅读 7,429评论 0 2
  • 不知何时 窗外的夏花开过这个沉寂的季节; 不知何时 曾经的书桌落上一层细细的尘土。 开始彷徨曾经浅浅的微笑, 终将...
    晰约阅读 1,270评论 0 1
  • 若果还能相遇我希望化为永恒。
    庄德坤阅读 1,409评论 0 0
  • 开始接受必须要去面对的事情 如果偏执是种病,那么我就已经病入膏肓了,像痴呆症一样没有烦恼,像狂躁症一样快乐,...
    王王王wen阅读 3,060评论 0 0

友情链接更多精彩内容