Python基础语法练习题(62原始版本及其优化版本)

今天来记录一个题目的两个版本,一个是原始版本,一个是优化版本,在我看来,代码是一个底层逻辑,程序最终的运行还是呈现给用户看的,而无论用户是否懂得代码,都要可以进行程序的运行,否则这个代码的编写在我个人看来是不够人性化的。

第六十二题,计算两个日期天数差异:

原始版本:

复制代码
#编写一个程序,用于计算两个日期之间天数的差异

#导入datetime模块

import datetime

#用户输入第一个日期

datetime1 = datetime.datetime.strptime(input('请输入第一个日期(输入格式为YYYY-MM-DD):'), '%Y-%m-%d')

#用户输入第二个日期

datetime2 = datetime.datetime.strptime(input('请输入第二个日期(输入格式为YYYY-MM-DD):'), '%Y-%m-%d')

#计算两个日期之间天数的差异

difference = datetime2 - datetime1

difference = difference.days

print('两个日期之间天数的差异为:', difference, '天')

这边可以看到,原始版本代码的代码量还是很少的,确实实现了需求,然而在我看来只是实现需求还不太够,下面是关于原始版本的代码思路的简单分析:

题目要求:计算两个日期之间相差多少天。

我的核心思路:让日期自己做减法

手算两个日期差几天,要处理大小月、闰年、跨年,太麻烦。但我发现 datetime 里的日期对象之间可以直接相减,差值它自己就算好了,我完全不用碰日历数学。所以程序就三步:字符串转日期对象 → 对象相减 → 取出天数。

两个关键点

一是先转对象才能算。 用户输入的 "2026-10-10" 是字符串,减不动。我用 54 题的 strptime 配 '%Y-%m-%d' 模板,先把文字翻译成日期对象,减法才有的可算。

二是相减得到的是"时长对象",不是数字。 两个日期一减,拿到的是打包好时间隔的 timedelta 对象,得再点它的 .days 属性才能取出天数------这和 61 题点 .year 取属性是一个手法。

小结

一句话:strptime 把字符串变日期对象,对象相减得 timedelta,再取 .days。 最妙的体会是------datetime 让时间能像数字一样直接做减法,复杂的日期算术全被一个减号包办了。

接下来是优化版本代码:

复制代码
#编写一个程序,用于计算两个日期之间天数的差异(优化版)
#优化点:
#1.放宽输入格式,支持多种常见写法(如 2024-01-05 / 2024/1/5 / 2024.1.5 / 20240105)
#2.输入错误不会报错崩溃,而是提示后让用户重新输入

#导入datetime模块

import datetime

#定义支持的日期格式列表,程序会依次尝试,命中任意一个即视为输入合法

DATE_FORMATS = [
    '%Y-%m-%d',     # 2024-01-05
    '%Y/%m/%d',     # 2024/1/5
    '%Y.%m.%d',     # 2024.1.5
    '%Y%m%d',       # 20240105
    '%Y年%m月%d日',  # 2024年1月5日
]

#封装一个"读取并解析日期"的函数,输入非法时会循环提示,直到拿到合法日期为止

def input_date(prompt):
    while True:
        #先读取原始字符串,并去除首尾空格,避免误输入的空格导致解析失败
        date_str = input(prompt).strip()
        #依次尝试每一种格式,只要有一种能解析成功就返回日期对象
        for fmt in DATE_FORMATS:
            try:
                return datetime.datetime.strptime(date_str, fmt)
            except ValueError:
                #当前格式不匹配,换下一个格式继续尝试
                continue
        #所有格式都尝试失败,说明输入确实不合法,打印提示后让while循环进入下一轮重输
        print(f'  -> 输入的日期「{date_str}」无法识别,请重新输入(例如:2024-01-05)')

#用户输入第一个日期

datetime1 = input_date('请输入第一个日期:')

#用户输入第二个日期

datetime2 = input_date('请输入第二个日期:')

#计算两个日期之间天数的差异

difference = (datetime2 - datetime1).days

print('两个日期之间天数的差异为:', abs(difference), '天')

可以看到,代码量明显提升了许多,下面是优化版本代码的思路分析:

优化目标:解决原版"格式写死、输错就崩"的脆弱点。

原版思路没问题------strptime 转对象、相减、取 .days。但它只认 YYYY-MM-DD 一种写法,用户写成 2024/1/5 或 20240105 就崩;而且一失败就抛异常,得重跑程序。我这次就针对这两点加固。

优化一:多种格式挨个试。 我不再填单一模板,而是备好一张格式清单 DATE_FORMATS(连字符、斜杠、点号、纯数字、中文"年月日"全列上),用 for 循环逐个套用去试,哪种能解析成功就返回。失败就 continue 换下一种------"试错-换下一个"正是循环配异常的拿手活。

优化二:输错不崩、重来即可。 我把"读取+试格式"封装进 input_date() 函数,外面罩 while True:只有成功才 return,全部格式都失败也不崩溃,只提示一句再让用户重填,配合 strip() 顺手去掉误敲的空格。这套骨架就是 43/44 题整数验证的老手艺,只是验证对象换成了日期。

小结

核心计算我一处没动,全花在给用户输入留后路上:格式从单一到多种、出错从崩溃到重输。功能跑通只是及格线,扛得住乱输入才算"好用"。

相关推荐
第九序言T2 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Java后端的Ai之路2 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
qq_426003962 小时前
UI自动化高频次登录login限流解决方案
python·ui·自动化
Sakura_j_h_2 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
龙亘川3 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人3 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
quantdash_cc3 小时前
如何验证历史行情的交易日期是否完整覆盖研究区间?
python·数据分析·pandas·量化交易·股票数据·quantdash
I Am a robert girl3 小时前
当智能体学会“串通”:从长程交互中读懂涌现式合谋
python·多智能体系统·多智能体协作·llm agent·涌现式合谋·对齐问题·激励机制设计
Raas1004 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
云和数据.ChenGuang4 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain