python实现输出日历
- 2020 年 1 月 9 日
- 筆記
以下是使用几个简单的函数实现给定指定年月实现当月日历输出的程序,大部分内容引用自网易云课堂哈工大开设的Python程序设计入门函数一章的课后作业。
程序设计图如下:

自下往上看:
- is_leap_year 判断是否为闰年
- get_num_of_days_in_month 获得每月的天数
- get_total_num_of_days 获得自1800年1月1日以来经过的天数
- get_start_day 获得每月1日为星期几
- print_month_body 打印日历的数字部分
- get_month_name 获得每月的名称
- print_month_title 打印日历标题与头部部分
具体实现如下:
# coding=utf-8 __author__ = 'Leonard' def is_leap_year(year): # 判断是否为闰年 if year % 4 == 0 and year % 100 != 0 or year % 400 == 0: return True else: return False def get_num_of_days_in_month(year, month): # 给定年月返回月份的天数 if month in (1, 3, 5, 7, 8, 10, 12): return 31 elif month in (4, 6, 9, 11): return 30 elif is_leap_year(year): return 29 else: return 28 def get_total_num_of_day(year, month): # 自1800年1月1日以来过了多少天 days = 0 for y in range(1800, year): if is_leap_year(y): days += 366 else: days += 365 for m in range(1, month): days += get_num_of_days_in_month(year, m) return days def get_start_day(year, month): # 返回当月1日是星期几,由1800.01.01是星期三推算 return 3 + get_total_num_of_day(year, month) % 7 # 月份与名称对应的字典 month_dict = {1: 'January', 2: 'February', 3: 'March', 4: 'April', 5: 'May', 6: 'June', 7: 'July', 8: 'August', 9: 'September', 10: 'October', 11: 'November', 12: 'December'} def get_month_name(month): # 返回当月的名称 return month_dict[month] def print_month_title(year, month): # 打印日历的首部 print ' ', get_month_name(month), ' ', year, ' ' print '-------------------------------------' print ' Sun Mon Tue Wed Thu Fri Sat ' def print_month_body(year, month): ''' 打印日历正文 格式说明:空两个空格,每天的长度为5 需要注意的是print加逗号会多一个空格 ''' i = get_start_day(year, month) if i != 7: print ' ', # 打印行首的两个空格 print ' ' * i, # 从星期几开始则空5*几个空格 for j in range(1, get_num_of_days_in_month(year, month)+1): print '%4d' %j, # 宽度控制,4+1=5 i += 1 if i % 7 == 0: # i用于计数和换行 print ' ' # 每换行一次行首继续空格 # 主函数部分 year = int(raw_input("Please input target year:")) month = int(raw_input("Please input target month:")) print_month_title(year, month) print_month_body(year, month)
运行示例:

实现起来难度不大,只是在格式控制上需要花点心思,具体详见print_month_body函数的注释。
第一次用Python编了一个有八十行的程序,希望大家多多指教。