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学习插曲之万年历算法的主要内容,如果未能解决你的问题,请参考以下文章

算法,java代码实现打印万年历

基于至简设计法实现的万年历功能

万年历分析

万年历分析

万年历分析

Python--1小插曲之变量和字符串