本章通过判断第几天的4个案例来进行学习基础的Python程序
案例描述
输入某年某月某日,判断这一天是这一年的第几天?
例子:
输入的日期为2017/03/05,是2017年的第几天?
输入的日期为2012/03/05,是2012年的第几天?
分析:
每个月份的天数不同;
闰年与平年的2月份天数不同,平年是28天,闰年是29天
闰年判断:
四年一闰,百年不闰,四百年再闰
v1.0
新建一个简单的Python程序,先引用datatime库中的datatime,将规定格式输入的日期格式化,借此计算出年月日。每个月份的天数按平年存储并计算。存储使用元组数据类型,通过累加sum()元组的月份索引再加上本月天数即可得出平年时第几天,通过判断若为闰年则天数+1,否则跳过。
知识点:
1.元组
(1)元组(tuple)是特殊的序列类型
(2)一旦被创建就不能修改,使得代码更安全。不可以修改、删除、添加元素
(3)使用逗号和圆括号来表示,如 (‘red’, ‘blue’, ‘green’), (2, 4, 6) PS:元组只包含一个元素时,一定要在后面加上逗号。如:student = (50,)
(4)访问方式和列表相同
(5)一般用于表达固定数据项、函数多返回值等情况
(6)特点
a)元组中的元素可以是不同类型的
b)元组中各元素存在先后关系,可通过索引访问元组中元素
c)对元组集合内元素求和:sum(tuple)
(7)元组的内置函数
PS:Python元组的更多信息参考:
https://baijiahao.baidu.com/s?id=1607300920211170540&wfr=spider&for=pc
Python基本数据类型总结:https://blog.csdn.net/Q_Jimmy/article/details/80247559
主体代码:
# 输入日期
input_date_str = input("请输入日期(yyyy/mm/dd):")
# 日期格式化
input_date = datetime.strptime(input_date_str, "%Y/%m/%d")
# 分别是年、月、日
year = input_date.year
month = input_date.month
day = input_date.day
# 固定每个月份的天数
days_in_month_tup = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
# 计算当前第几天
days = sum(days_in_month_tup[:month - 1]) + day
# 判断是否闰年
if (year%400 == 0) or ((year%4 == 0) and (year%100 != 0)):
# 判断是否大于2月份
if month > 2:
days += 1
print("这是第{}天".format(days))
运行结果:
v2.0
在v1.0的基础上,2.0增加功能:用列表替换元组。列表元素可以修改,如果是闰年直接将2月份的天数改成29。首先将判断闰年语句集合成函数is_leap_year中,输入年份即可返回是否为闰年。接着将存储每月份天数的元组更改为列表,当判断为闰年时直接改列表中2月份天数为29。计算天数则直接sum列表+当月天数。注意列表月份要 - 1。
知识点:
1.列表和元组区别
(1)元组是不可变的,列表是可变的
(2)元组通常由不同的数据组成,列表通常是由相同类型的数据组成
(3)元组表示的是结构,列表表示的是顺序
PS:“文化差异“是指二者在实际使用中的差异:在你有一些不确定长度的相同类型队列的时候使用列表;在你提前知道元素数量的情况下使用元组,因为元素的位置很重要。
举个例子,假设你有一个函数是用来在目录中查找结尾为 *.py 的文件。函数返回的应该是一个列表,因为你并不知道你会找到多少个文件,而这些文件都有相同的含义:它们仅仅是你找到的另一个文件。
另一方面,让我们假设你需要存储五个值来代表气象观测站的位置:id ,城市,国家,纬度,经度。元组就比列表更适用于这种情况:
PS:列表与元组的区别参考文章:http://python.jobbole.com/86661/
具体代码:
from datetime import datetime
def is_leap_year(year):
"""
判断是否闰年
"""
is_leap = False
# 判断是否闰年
if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
is_leap = True
return is_leap
def main():
"""
主函数
"""
# 输入日期
input_date_str = input("请输入日期(yyyy/mm/dd):")
# 日期格式化
input_date = datetime.strptime(input_date_str, "%Y/%m/%d")
# 分别是年、月、日
year = input_date.year
month = input_date.month
day = input_date.day
# 每个月份的天数
days_in_month_list = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# 判断是否闰年,闰年则+1
if is_leap_year(year):
days_in_month_list[1] = 29
# 计算当前第几天
days = sum(days_in_month_list[:month - 1]) + day
print("该日期为第{}年的第{}天".format(year, days))
运行结果:
v3.0
在2.0的基础上,3.0增加功能:将月份划分为不同的集合再操作。将月份分为2个集合,分别为30天的和31天的。for迭代循环月份对象,判断i月份在哪个集合,若30则计数加30,若31则计数加31,若两个都不在则加28。最后判断是否为闰年,再加1。
知识点:
1.集合
(1)Python中的集合(set)类型同数学中的集合概念一致,即包含0或多个
数据项的无序组合
(2)集合中的元素不可重复
(3)集合是无序组合,没有索引和位置的概念
(4)set()函数用于集合的生成,返回结果是一个无重复且排序任意的集合
(5)集合通常用于表示成员间的关系、元素去重等
PS:Python基本数据类型总结:
https://blog.csdn.net/Q_Jimmy/article/details/80247559
集合操作效果图:
例子主要代码如下:
from datetime import datetime
def is_leap_year(year):
"""
判断是否闰年
"""
is_leap = False
# 判断是否闰年
if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
is_leap = True
return is_leap
def main():
"""
主函数
"""
# 输入日期
input_date_str = input("请输入日期(yyyy/mm/dd):")
# 日期格式化
input_date = datetime.strptime(input_date_str, "%Y/%m/%d")
# 分别是年、月、日
year = input_date.year
month = input_date.month
day = input_date.day
# 30天月份集合
_30_days_in_month = {4, 6, 9, 11}
# 31天月份集合
_31_days_in_month = {1, 3, 5, 7, 8, 10, 12}
days = 0
days += day
# 计算当前第几天
for i in range(1, month):
if i in _30_days_in_month:
days += 30
elif i in _31_days_in_month:
days += 31
else:
days += 28
# 判断是否闰年,闰年则+1
if is_leap_year(year):
days += 1
print("该日期为第{}年的第{}天".format(year, days))
代码部分运行结果:
v4.0
在v3.0的基础上,4.0增加功能:将月份及其对应天数通过字典表示。字典有两个版本,分别是月份-天数字典和天数-月份字典。数据存放key和value分别为月份和天数。这两个版本都有不同的计算天数方式。最终也是判断是否闰年,是则加1。
知识点:
1.字典
(1)字典类型(dict)是“键--值”数据项的组合,每个元素是一个键值对。如:身份证号(键)--个人信息(值)
(2)字典类型数据通过映射查找数据项
(3)映射:通过任意键查找集合中的值的过程
(4)字典类型的数据是无序的
(5)字典类型以键为索引,一个键对应一个值
(6)字典的键值不可以为list或者set类型,可以是tuple
PS:Python的字典类型操作详解:https://www.cnblogs.com/scios/p/8108243.html
字典操作示例:
主要代码:
# 输入日期
input_date_str = input("请输入日期(yyyy/mm/dd):")
# 日期格式化
input_date = datetime.strptime(input_date_str, "%Y/%m/%d")
# 分别是年、月、日
year = input_date.year
month = input_date.month
day = input_date.day
# 月份-天数字典
month_day_dict = {
1: 31,
2: 28,
3: 31,
4: 30,
5: 31,
6: 30,
7: 31,
8: 31,
9: 30,
10: 31,
11: 30,
12: 31
}
# 天数-月份字典
day_month_dict = {
30: {4, 6, 9, 11},
31: {1, 3, 5, 7, 8, 10, 12}
}
# 初始化days,并加上当月天数
days = 0
days += day
# # 计算当前第几天v1.0
# for i in range(1, month):
# days += month_day_dict[i]
# 计算当前第几天v2.0
for i in range(1, month):
if i in day_month_dict[30]:
days += 30
elif i in day_month_dict[31]:
days += 31
else:
days += 28
# 判断是否闰年,闰年则+1
if is_leap_year(year):
days += 1
print("该日期为第{}年的第{}天".format(year, days))
执行结果:
总结
判断第几天的4个例子,知识点归纳如下:
PS:Python提供了一个可以直接获取“第几天”的方法,一行代码就能完成
完整代码查看码云






网友评论