python新手练习实例之万年历
作者:Begin?to?change 发布时间:2021-01-29 02:20:35
一、题目描述
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去验证单个的函数是否正确;
来源:https://blog.csdn.net/qq_41404557/article/details/124820965


猜你喜欢
- 本文为大家分享了pygame游戏之旅的第3篇,供大家参考,具体内容如下载入car图片(我自己画的),需要用到pygame.image模块,定
- --创建测试数据库 CREATE DATABASE Db GO --对数据库进行备份 BACKUP DATABASE Db TO DISK=
- 概述路由是自定义url地址执行指定的函数,良好的路由定义可以对seo起到很好的效果。1. 基本路由gin框架封装了http库,提供了 GET
- 我们把对象(变量)从内存中变成可存储的过程称之为序列化,比如XML,在Python中叫pi
- 本文实例为大家分享了Python实现京东秒杀功能的具体代码,供大家参考,具体内容如下#Python 3.5#coding:utf-8#imp
- 国 * 公司安全团队开发出利用赛门铁克数据库安全与审计(SDSA)设备监视数据库的一系列客户化的政策。他们是如何在已有安全策略基础上做优
- 从最基础的说起。本教程中,所有IE 均指 WindowXP + IE 6.0, 所有 FF 均指 FF 1.5。1. 不用编程的部分1.1
- 本文实例讲述了Python迭代器和生成器定义与用法。分享给大家供大家参考,具体如下:迭代器 iter()迭代器是访问集合中元素的一种方式,迭
- 插值主要用于物理学数学中,逼近某一确定值的方法(1)插值是通过已知的离散数据求未知数据的方法。(2)与拟合不同,插值要求曲线通过所有的已知数
- 对于三目运算符(ternary operator),python可以用conditional expressions来替代如对于x<5
- python入门细节相除后的类型type(2/2)floattype(2//2)int双斜杠是整除,出来的类型是int。单斜杠的出来的是fl
- 用法分析 在查看SRGAN源码时有如下损失函数,其中设置了retain_graph=True,其作用是什么?################
- 什么是Autopep8在python开发中, 大家都知道,python编码规范是PEP8,但是在市级开发中有的公司严格要求PEP8规范开发,
- 一、php中pcntl_fork函数概述pcntl_fork()函数是php中用于创建子进程的一个函数,返回创建的子进程的pid。该函数创建
- 如下所示:import tensorflow as tftfe = tf.contrib.eagertf.enable_eager_exec
- SQL Server 获取数据的总记录数,有两种方式:1.先分页获取数据,然后再查询一遍数据库获取到总数量2.使用count(1) over
- 在 python 中有一个 telnetlib,它的作用就是建立一个通到主机的 telnet连线实体
- 本文实例讲述了Python列表操作。分享给大家供大家参考,具体如下:#coding=utf8'''''
- 本文为大家分享了mysql 5.7.17 winx64解压版安装配置方法,供大家参考,具体内容如下一、下载下载地址二、配置1. 解压下载的m
- 1.锁生活中:锁在我们身边无处不在,比如我出门玩去了需要把门锁上,比如我需要把钱放到保险柜里面,必须上锁以保证我财产的安全。代码中:比如多个