有网友提了一个问题:如何用 Python 实现输入 1~12,返回对应的英文月份简写。
看似简单的一个问题,其中却隐含了关于与用户交互的深层逻辑:
如何更友好?如何更健壮?
那么一起看看如何做到吧。
条条大路通罗马
如果就结果而言,解决方法可谓五花八门,可谓条条大路同罗马,而且还有很多 Python 库支撑的方法,比如用 Pendulum
库,可以轻松实现对时间的复杂处理。
之前笔者写了一篇关于 Pendulum 库的介绍 ——
跟 “最烦用 Python 处理时间了” 说拜拜,可以参考一下。
不过,这一道题目,是一个编程练习题,主要是为了训练学习者对Python 代码的熟悉程度,是一个很有意义的练习题目,值得思考和练习。
问题分解
那么如何开始呢?首先需要将这个问题拆解成几个简单部分:
- 为引导用户输入,并对输入内容进行判断;
- 创建一个英文月份缩写的词典或者列表(主要出于对 Python 基本数据结构的练习考虑,所以不采用标准库或者第三方库的实现方式)
- 根据用户输入的内容,获得正确的月份缩写,并完成输出
处理用户输入
对于需要与用户交互的地方,需要考虑到用户的 输入错误 的情况。
因为计算机是会严格执行指令的,但人不行,人擅长的是思考、扩展与创造,所以我们的程序要尽可能适应用户的输入。
如果站在用户的立场上,这个特性叫人性化。
如何实现呢?直接看代码:
1 | def digit_input(msg = "请输入一个数字:"): |
可能会感觉有点晕,我稍作说明。
- 先定义了一个
digit_input
方法,专门用了引导用户输入一个数字,如果输入对了,返回 (0, value) 元组,0 表示输入正确,value
即为用户输入的值(已经转为数值类型了);如果输入有错,返回 (1, None) ,表示输入有勿,即输入的是非数字 - 在
main
方法中,有个死循环,如果用户输入不正确的话就会不断地让用户输入,在此先不考虑退出机制,因为用户不想输入直接关闭程序就好了 - 在循环中,调用
digit_input
方法,获得一个用户的输入,并进行判断,如果是数字,判断是否在 1~12之间,如果不在给出提示,继续循环。如果用户输入的不是数字,直接给出提示,继续循环。只有当用户输入的是数字且在 1~12之间时,才退出循环,而用户输入的值为存放在value
中。
建立月份缩写列表
1 | month_short_name = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] |
这里也可以用词典代替列表,因为我们要通过输入的数字获得值,利用列表方便一些,因为列表可以看成键值为数字的词典对象。
不过有个问题就是:
列表的起始索引是0,而我们输入的月份起始是1
如何对应呢?
采用 空间换时间 的方法,将列表的第一个位置存入空值,这样数字就能与列表中的索引对应正确了。
输出
前面已经获得了用户的正确输入,并有了一个月份列表,这一步就简单了:
1 | print(month_short_name[value]) |
直接打印出 value
作为索引 在 month_short_name
中的值就可以了。
集成
将代码合成起来就是:
1 | def digit_input(msg = "请输入一个数字:"): |
总结
虽然这道题目很简单,但是它的目标绝不是为了获得正确答案就可以了。
对于编程来说,最重要的是:
思考方式,是否考虑的周全,是否能替用户多想一步
很多时候我们在努力帮助用户的同时,其实是在帮助我们自己。
比心!