Python学习插曲之万年历算法
Posted @一支烟的功夫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习插曲之万年历算法相关的知识,希望对你有一定的参考价值。
Python实现万年历
1. 最近在学习Python的过程中,想起了以前学习C语言时的万年历算法,就打算写一下,主要是为了熟悉Python的语法,以此来铭记一下Python的学习历程。
2. 实现万年历需要用到的基本知识有
- 闰年判断算法
- 给定某年某月某日是星期几,计算某年某月某日是星期几算法(通常以1800年1月1日星期三为起始)
- 计算两个给定日期之间相隔多少天
3. 以下是代码实现:
#coding=utf-8
"""
@ function perpetual calendar;
@author: wly
@Date: 2017-03-05
@description: 输入一个年份可以打印这一年的日历。Python基础学习插曲
"""
"""
1.is_leap_year 判断是否问闰年的函数
2.get_month_days 获取一个月有多少天
3.get_total_days 已知1800年1月1日为星期3,距某年某月多少天
4.get_start_day 获取某年某月的第一天是星期几
"""
# 定义基础数据
arrWeek = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
arrMonth = ["January","February","March","April","May","June","July","August","September","October","November","December"];
def is_leap_year(year):
if (year % 4 ==0 and year % 100 !=0 or year % 400 ==0):
return True
else:
return False
def get_month_days(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_days(year,month):
days = 0;
for i in range(1800,year):
if(is_leap_year(i)):
#闰年
days += 366;
else:
#平年
days += 365;
#一直计算到所求月份前一个月即可
for j in range(1,month):
days += get_month_days(year, j);
return days;
def get_start_day(year,month):
#计算是星期几
return (3 + get_total_days(year, month)) % 7;
def print_calendar(year):
for k,m in enumerate(arrMonth):
#打印日历的月份和年份
print " ",m," ",year
print "---------------------------"
#计算这个月有几天
day = get_month_days(year, k+1);
#计算这个月的第一天是星期几
startDay = get_start_day(year, k+1);
#打印星期表头
for k,v in enumerate(arrWeek):
print "%3s" % v,
print
#打印这个月的天数
for i in range(1,day+1):
#计算要缩进几个单位
temp = (startDay + i-1) % 7
#用于缩进格式,只要这个月的第一天缩进正确即可
if(i==1):
#循环打印缩进单位
for j in range(temp):
print " ",
print "%3s" % i,
#打印到星期六之后要换行
if(temp == 6) :
print
#一个月遍历完成打印结束分隔符
print
print "---------------------------"
#调用程序
print_calendar(2017);
4. 运行结果如下图:
以上是关于Python学习插曲之万年历算法的主要内容,如果未能解决你的问题,请参考以下文章