您的位置:首页 > 编程语言 > Python开发

15_python_练习题——打印日历

2017-03-06 17:09 295 查看
python 本身有一个类库,可以直接打印日历,但是也能自己组织语言重新写出来打印日历的方法,本文说明这两种方法的使用

第一种方法

使用python自带的内部库

#!/usr/bin/python
# coding:utf-8

# 引入日历模块
import calendar

# 输入指定年月
yy = int(input("输入年份: "))
mm = int(input("输入月份: "))

# 显示日历
print(calendar.month(yy,mm))

calendar.prcal(yy)
运行结果:
输入年份: 2017
输入月份: 3
March 2017
Mo Tu We Th Fr Sa Su
1  2  3  4  5
6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

2017

January                   February                   March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
1             1  2  3  4  5             1  2  3  4  5
2  3  4  5  6  7  8       6  7  8  9 10 11 12       6  7  8  9 10 11 12
9 10 11 12 13 14 15      13 14 15 16 17 18 19      13 14 15 16 17 18 19
16 17 18 19 20 21 22      20 21 22 23 24 25 26      20 21 22 23 24 25 26
23 24 25 26 27 28 29      27 28                     27 28 29 30 31
30 31

April                      May                       June
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
1  2       1  2  3  4  5  6  7                1  2  3  4
3  4  5  6  7  8  9       8  9 10 11 12 13 14       5  6  7  8  9 10 11
10 11 12 13 14 15 16      15 16 17 18 19 20 21      12 13 14 15 16 17 18
17 18 19 20 21 22 23      22 23 24 25 26 27 28      19 20 21 22 23 24 25
24 25 26 27 28 29 30      29 30 31                  26 27 28 29 30

July                     August                  September
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
1  2          1  2  3  4  5  6                   1  2  3
3  4  5  6  7  8  9       7  8  9 10 11 12 13       4  5  6  7  8  9 10
10 11 12 13 14 15 16      14 15 16 17 18 19 20      11 12 13 14 15 16 17
17 18 19 20 21 22 23      21 22 23 24 25 26 27      18 19 20 21 22 23 24
24 25 26 27 28 29 30      28 29 30 31               25 26 27 28 29 30
31

October                   November                  December
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
1             1  2  3  4  5                   1  2  3
2  3  4  5  6  7  8       6  7  8  9 10 11 12       4  5  6  7  8  9 10
9 10 11 12 13 14 15      13 14 15 16 17 18 19      11 12 13 14 15 16 17
16 17 18 19 20 21 22      20 21 22 23 24 25 26      18 19 20 21 22 23 24
23 24 25 26 27 28 29      27 28 29 30               25 26 27 28 29 30 31
30 31


calendar中有一个setfirstweekday()的方法,weekday的范围是 0 (Monday) to 6 (Sunday),即我们可以调整每周开始的那天到底是星期几

calendar.setfirstweekday(6)
calendar.prcal(2016)

结果如下:
2016

January Febru
4000
ary March
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 1 2 3 4 5 6 1 2 3 4 5
3 4 5 6 7 8 9 7 8 9 10 11 12 13 6 7 8 9 10 11 12
10 11 12 13 14 15 16 14 15 16 17 18 19 20 13 14 15 16 17 18 19
17 18 19 20 21 22 23 21 22 23 24 25 26 27 20 21 22 23 24 25 26
24 25 26 27 28 29 30 28 29 27 28 29 30 31
31

April May June
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 1 2 3 4 5 6 7 1 2 3 4
3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11
10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18
17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25
24 25 26 27 28 29 30 29 30 31 26 27 28 29 30

July August September
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 1 2 3 4 5 6 1 2 3
3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 10
10 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 17
17 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 24
24 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 30
31

October November December
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 1 2 3 4 5 1 2 3
2 3 4 5 6 7 8 6 7 8 9 10 11 12 4 5 6 7 8 9 10
9 10 11 12 13 14 15 13 14 15 16 17 18 19 11 12 13 14 15 16 17
16 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 24
23 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 31
30 31


第二种方法

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 打印日历标题与头部部分

#!/usr/bin/python
# coding=utf-8

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(1, 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 1+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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: