0%

一道小小 Python 编程题,体会编程之美

有网友提了一个问题:如何用 Python 实现输入 1~12,返回对应的英文月份简写。

看似简单的一个问题,其中却隐含了关于与用户交互的深层逻辑:

如何更友好?如何更健壮?

那么一起看看如何做到吧。

条条大路通罗马

如果就结果而言,解决方法可谓五花八门,可谓条条大路同罗马,而且还有很多 Python 库支撑的方法,比如用 Pendulum 库,可以轻松实现对时间的复杂处理。

之前笔者写了一篇关于 Pendulum 库的介绍 ——
跟 “最烦用 Python 处理时间了” 说拜拜,可以参考一下。​

不过,这一道题目,是一个编程练习题,主要是为了训练学习者对Python 代码的熟悉程度,是一个很有意义的练习题目,值得思考和练习。

问题分解

那么如何开始呢?首先需要将这个问题拆解成几个简单部分:

  1. 为引导用户输入,并对输入内容进行判断;
  2. 创建一个英文月份缩写的词典或者列表(主要出于对 Python 基本数据结构的练习考虑,所以不采用标准库或者第三方库的实现方式)
  3. 根据用户输入的内容,获得正确的月份缩写,并完成输出

处理用户输入

对于需要与用户交互的地方,需要考虑到用户的 输入错误 的情况。

因为计算机是会严格执行指令的,但人不行,人擅长的是思考、扩展与创造,所以我们的程序要尽可能适应用户的输入。

如果站在用户的立场上,这个特性叫人性化。

如何实现呢?直接看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def digit_input(msg = "请输入一个数字:"):
value = input(f"{msg}\n")
if value.isdigit():
return 0, int(value)
else:
return 1, None

if __name__ == '__main__':
value = None
while True:
code, value = digit_input("请输入一个 1~12 的整数:")
if code == 0:
if value < 1 or value > 12:
print("您输入的整数小于1或者大于12!")
else:
# 输入正确
break
else:
print("您输入的不是整数!")

可能会感觉有点晕,我稍作说明。

  • 先定义了一个 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def digit_input(msg = "请输入一个数字:"):
value = input(f"{msg}\n")
if value.isdigit():
return 0, int(value)
else:
return 1, None

month_short_name = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

if __name__ == '__main__':
value = None
while True:
code, value = digit_input("请输入一个 1~12 的整数:")
if code == 0:
if value < 1 or value > 12:
print("您输入的整数小于1或者大于12!")
else:
# 输入正确
break
else:
print("您输入的不是整数!")

print(month_short_name[value])

总结

虽然这道题目很简单,但是它的目标绝不是为了获得正确答案就可以了。

对于编程来说,最重要的是:

思考方式,是否考虑的周全,是否能替用户多想一步

很多时候我们在努力帮助用户的同时,其实是在帮助我们自己。

比心!