python新手练习实例之万年历

目录
  • 一、题目描述
  • 二、解析
    • 1、分析
    • 2、功能
  • 三、源码
  • 四、经验
  • 总结

一、题目描述

A:先输出提示语句,并接受用户输入的年、月。

B:根据用户输入的年,先判断是否是闰年。

C:根据用户输入的月来判断月的天数。

D:用循环计算用户输入的年份距1900年1月1日的总天数。

E:用循环计算用户输入的月份距输入的年份的1月1日共有多少天。

F:相加D与E的天数,得到总天数。

G:用总天数来计算输入月的第一天的星期数。

H:根据G的值,格式化输出这个月的日历!

二、解析

1、分析

根据题目的八个要求,可以看出有些功能是重复或者说需要相互调用的,所以可以用模块的思想将每个要求封装成函数;

2、功能

①判断是否是闰年函数

根据闰年的判断规则,如果年是4的倍数,但不是100的倍数则是闰年或者是400的整数倍也是闰年,所以函数需要传入一个参数(年份)

#判断闰年
def B(year):
    if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
        return True
    return False

②判断输入月的天数的函数

除了2月份会根据平年和闰年发生变化以外, 每月的天数是已经确定好的;所以此时需要调用已经定义好的判断闰年的函数才能确定二月的天数;所以函数需要传入两个参数(月份和年份)

此时有两个小技巧,一个是判断月份是那月,最开始用的是用相等加上or去判断是否满足条件,其实可以将大月或者小月的月份写到一个列表中,然后再通过in去判断;第二个是在确定天数时,可以先定义好一个常用值,然后根据月份去修改其值,最后返回常用值即可,这样就少了几行的赋值以及返回的代码

def C(year,month):
    days = 31        #31天居多,设置为默认值
    if month == 2 :    #2月份要判断是否是闰年
        if B(year):
            days=29
        else:
            days=28;
    elif month in [4,6,9,11]:     #判断小月,只有30天
        days=30
    return days

③计算年份距离1900的总天数的函数

因为平年跟闰年的天数不一样,所以要调用判断闰年的函数,确定其一年的总天数;

总天数也就是相当于求每年的天数之和即可;所以需要去遍历每年的天数求其总和即为结果;所以函数需要传入一个参数(年份)

#某年到1900年的天数
def D(year:int):
    day = 0
    for i in range(1900,year):
        if B(i):
            day +=366
        else:
            day +=365
    return day

④ 月份距离1月1日的天数的函数

距离1月1日的天数也就是每月天数的总和,此时就先需要确定其每月的天数,也就是需要调用之前定义的函数,还需要知道的是其年份判断是否闰年,所以函数需要传入两个参数(年份和月份)

遍历每月的天数(通过调用函数而来),然后将其求和,得到的就是需要的结果

#某月到1月1号的天数
def E(year:int,month:int):
    days = 0
    for i in range(1,month):
        days += C(year,i)
    return days

⑤确定星期几的函数

首先通过调用求年份距离的天数和月份的天数得到其天数总和,所以函数需要传入两个参数(月份和年份)

然后将总和加一(因为得到的是月份,而算天数时要奖当日计算再内),然后对7求余即为星期几

#确定星期几
def G(year:int,month:int):
    total_day = D(year) + E(year,month) + 1
    week = total_day % 7
    return week

⑥格式化输出日历函数

输出有两种格式,一种是星期日在第一天,一种是星期日在最后一天;

第一种方式:星期日在第一天,根据得到的星期几函数(也就是当月1号的星期几函数),可以确定第一天的位置(也就是1的位置);

日历也就是输出1到总天数(根据月份确定)在对应的位置(星期几),由于1号的位置已经确定,而一号前面的则为空,所以单独遍历输出空格,然后再输出日历;

一周对应的是七天,也就是每七天进行一次换行,所以还需要定义一个计数器

第二种方式:也就是星期日在最后一天,其他逻辑都是一样的,只是在确定1号的位置不一样;

本来周日的位置为第一个,但是现在变成了最后一个,也就是位置向后移了6位,所以只需要计算位置的时候先将其加上,然后再求余即可

#格式化输出
def my_print(total:int):
    # iCount = 0
    # print("日\t一\t二\t三\t四\t五\t六")
    # for i in range((G(year, month) % 7)):
    #     print(end='\t')
    #     iCount += 1
    # for i in range(1, C(year, month) + 1):
    #     print(i, end='\t')
    #     iCount += 1
    #     if iCount  % 7 == 0:
    #         print('')
    iCount = 0
    print('一\t二\t三\t四\t五\t六\t日\t')
    for i in range(((G(year,month) + 6) % 7)):
        print(end='\t')
        iCount +=1
    for i in range(1,C(year,month) + 1):
        print(i,end='\t')
        iCount +=1
        if iCount % 7 == 0:
            print('')

三、源码

# -*- coding: utf-8 -*-
from datetime import date
import calendar

# def B(year):
#    if year/4==0 and  year/400 !=0:
#        return True
#    elif year/100 == 0 and year/400 ==0 :
#        return True
#    else:
#         return False
#判断闰年
def B(year):
    if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
        return True
    return False

# def C(year:int,month:int):
#     days = 30
#     if month in [1,3,5,7,8,10,12]:
#         days = 31
#     elif month == 2:
#         if B(year):
#             days = 29
#         else:
#             days = 28
#     return days
#每月的天数
def C(year,month):

    days = 31        #31天居多,设置为默认值
    if month == 2 :    #2月份要判断是否是闰年
        if B(year):
            days=29
        else:
            days=28;
    elif month in [4,6,9,11]:     #判断小月,只有30天
        days=30
    return days

#某年到1900年的天数
def D(year:int):
    day = 0
    for i in range(1900,year):
        if B(i):
            day +=366
        else:
            day +=365
    return day

#某月到1月1号的天数
def E(year:int,month:int):
    days = 0
    for i in range(1,month):
        days += C(year,i)
    return days

#确定星期几
def G(year:int,month:int):
    total_day = D(year) + E(year,month) + 1
    week = total_day % 7
    return week

#格式化输出
def my_print(total:int):
    # iCount = 0
    # print("日\t一\t二\t三\t四\t五\t六")
    # for i in range((G(year, month) % 7)):
    #     print(end='\t')
    #     iCount += 1
    # for i in range(1, C(year, month) + 1):
    #     print(i, end='\t')
    #     iCount += 1
    #     if iCount  % 7 == 0:
    #         print('')
    iCount = 0
    print('一\t二\t三\t四\t五\t六\t日\t')
    for i in range(((G(year,month) + 6) % 7)):
        print(end='\t')
        iCount +=1
    for i in range(1,C(year,month) + 1):
        print(i,end='\t')
        iCount +=1
        if iCount % 7 == 0:
            print('')

if __name__ == '__main__':
    year = int(input('请输入年:'))
    month = int(input('请输入月'))
    my_print(G(year,month))

四、经验

因为函数多,而且计算的结果不方便去口头的验算其结果,也就是说当结果不对时不知道是那出现的问题时,系统提供的

from datetime import date
import calendar

两个模块中有方法可以得出其天数以及星期几的结果,这样就可以查找到底是哪一步出现的问题了;也可以通过print去验证单个的函数是否正确;

总结

到此这篇关于python新手练习实例之万年历的文章就介绍到这了,更多相关python实现万年历内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 利用python实现万年历的查询

    今天要用python做一个小功能,那就是实现万年历的查询. 首先看一下整体感觉 实现代码: def is_leap_year(year): if year/4==0 and year/400 !=0: return True elif year/100 == 0 and year/400 ==0 : return True else: return False 首先判断是否是闰年,因为计算2月是否有29天有用. def getMonthDays(year,month): days = 31 #3

  • Python实现的简单万年历例子分享

    复制代码 代码如下: #!/usr/bin/env python2#-*- coding:utf-8 -*-__author__ = 'jalright' """使用python实现万年历""" def is_leap_year(year):    """判断是否是闰年,返回boolean值    """    if year/4==0 and  year/400 !=0:       

  • python万年历实现代码 含运行结果

    本文实例为大家分享了python实现万年历的具体代码,供大家参考,具体内容如下 #coding:utf-8 def leap_year(year):#判断平瑞年 if year%4==0 and year%100!=0 or year%400==0: return True else: return False def getMonthDays(year,month):#得到每个年份每月的天数 days = 31 if month == 2 : if leap_year(year): days=

  • python新手练习实例之万年历

    目录 一.题目描述 二.解析 1.分析 2.功能 三.源码 四.经验 总结 一.题目描述 A:先输出提示语句,并接受用户输入的年.月. B:根据用户输入的年,先判断是否是闰年. C:根据用户输入的月来判断月的天数. D:用循环计算用户输入的年份距1900年1月1日的总天数. E:用循环计算用户输入的月份距输入的年份的1月1日共有多少天. F:相加D与E的天数,得到总天数. G:用总天数来计算输入月的第一天的星期数. H:根据G的值,格式化输出这个月的日历! 二.解析 1.分析 根据题目的八个要求

  • Python新手如何进行闭包时绑定变量操作

    搞不清楚在闭包(closures)中Python是怎样绑定变量的 看这个例子: >>> def create_multipliers(): ... return [lambda x : i * x for i in range(5)] >>> for multiplier in create_multipliers(): ... print multiplier(2) ... 期望得到下面的输出: 0 2 4 6 8 但是实际上得到的是: 8 8 8 8 8 实例扩展:

  • Python新手学习raise用法

    当程序出现错误时,系统会自动引发异常.除此之外,Python 也允许程序自行引发异常,自行引发异常使用 raise 语句来完成. 很多时候,系统是否要引发异常,可能需要根据应用的业务需求来决定,如果程序中的数据.执行与既定的业务需求不符,这就是一种异常.由于与业务需求不符而产生的异常,必须由程序员来决定引发,系统无法引发这种异常. 如果需要在程序中自行引发异常,则应使用 raise 语句.raise 语句有如下三种常用的用法: raise:单独一个 raise.该语句引发当前上下文中捕获的异常(

  • Python新手学习装饰器

    python函数式编程之装饰器 1.开放封闭原则 简单来说,就是对扩展开放,对修改封闭. 在面向对象的编程方式中,经常会定义各种函数.一个函数的使用分为定义阶段和使用阶段,一个函数定义完成以后,可能会在很多位置被调用.这意味着如果函数的定义阶段代码被修改,受到影响的地方就会有很多,此时很容易因为一个小地方的修改而影响整套系统的崩溃,所以对于现代程序开发行业来说,一套系统一旦上线,系统的源代码就一定不能够再改动了.然而一套系统上线以后,随着用户数量的不断增加,一定会为一套系统扩展添加新的功能. 此

  • python装饰器实例大详解

    一.作用域 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我们要理解两点: a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修改全局定义的变量(当然有方法可以修改) 下面我们来看看下面实例: x = 1 def funx(): x = 10 print(x) # 打印出10 funx() print(x) # 打印出1 如果局部没有定义变量x,那么函数内部会从内往

  • Python 调用Java实例详解

    Python 调用Java实例详解 前言: Python 对服务器端编程不如Java 所以这方面可能要调用Java代码 前提: Linux 环境  1 安装 jpype1 安装后测试代码: from jpype import * startJVM(getDefaultJVMPath(), "-ea") java.lang.System.out.println("Hello World") shutdownJVM() 2 调用非jdk的jar包, test.jar 包

  • python 系统调用的实例详解

    python 系统调用的实例详解               本文将通过两种方法对python 系统调用进行讲解,包括python使用CreateProcess函数运行其他程序和ctypes模块的实例, 一 python使用CreateProcess函数运行其他程序 >>> import win32process >>> handle = win32process.CreateProcess('c:\\windows\\notepad.exe','',None,None

  • python中类和实例如何绑定属性与方法示例详解

    前言 python类与实例的方法的调用中觉得云里雾里,思考之后将自己的想法记录下,一来加深自己理解,巩固自己记忆,而来帮助一些想要学习python的朋友理解这门抽象的语言,由于Python是动态语言,类以及根据类创建的实例可以任意绑定属性以及方法,下面分别介绍. 1.类绑定属性 类绑定属性可以直接在class中定义属性,这种属性是类属. class Student(object): name = 'Student' 这个属性虽然归类所有,但类的所有实例都可以访问到. class Student(

  • Python 实现链表实例代码

    Python 实现链表实例代码 前言 算法和数据结构是一个亘古不变的话题,作为一个程序员,掌握常用的数据结构实现是非常非常的有必要的. 实现清单 实现链表,本质上和语言是无关的.但是灵活度却和实现它的语言密切相关.今天用Python来实现一下,包含如下操作: ['addNode(self, data)'] ['append(self, value)'] ['prepend(self, value)'] ['insert(self, index, value)'] ['delNode(self,

  • Python 加密的实例详解

     Python 加密的实例详解 hashlib支持md5,sha1,sha256,sha384,sha512,用法和md5一样 import hashlib #hashlib支持md5,sha1,sha256,sha384,sha512,用法和md5一样 m = hashlib.md5() #创建加密对象 m.update(b'password') #对输入内容进行加密, m.digest() #获取二进制加密密文 m.hexdigest() #获取十六进制加密密文 '''''python3默认

随机推荐