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 题整数验证的老手艺,只是验证对象换成了日期。

小结

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

相关推荐
棉猴1 小时前
玩游戏学Python4-字符串
python·游戏·字符串·pygame·玩游戏
马剑威(威哥爱编程)1 小时前
【AI全栈后端12-12】Spring Boot 3.x 到 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·开发语言·spring boot·后端
三月微暖寻春笋1 小时前
【和春笋一起学C++】(七十二)类模板
开发语言·c++·实例·类模板·使用类模板·数组模板
释厄6231 小时前
智能体释放度子集律——文本 ⊂ 音频 ⊂ 视频⊂ 游戏
开发语言·游戏·microsoft·音视频
东来也_八门1 小时前
我用麦当劳开放的 MCP,把那个最冷门的营养接口做成了真实配餐求解器
python
Sarvartha1 小时前
Object 类
java·开发语言
AI日报派送佬1 小时前
Ultralytics YOLO 模型训练技巧与最佳实践
人工智能·python·深度学习·yolo·机器学习·计算机视觉
zhaowangji2 小时前
mujoco仿真(机械臂推动正方体到指定位置)
人工智能·python
数据管道工2 小时前
解析一个老网站:GBK 编码、页面结构漂移与限流退避
python