前言
今天的计导课上,老师让我上台完成他上一次布置的作业——用Python判断一个三位数是否为水仙花数。这道题目其实非常简单,用Python 3.6实现如下:
num = int(input('请输入一个三位数:'))
a = num // 100 #百位
b = num // 10 % 10 #十位
c = num % 10 #个位
if(num == pow(a,3) + pow(b,3) + pow(c,3)):
print("%d是水仙花数" %num)
else:
print("%d不是水仙花数" %num)
下面给出两组输出样例:
请输入一个三位数:123
123不是水仙花数
请输入一个三位数:153
153是水仙花数
当我以为这道题就这么讲完了的时候,老师突然提出了一个新的问题:当用户输入的不是一个三位数的话该怎么处理呢?确实,如果想要编写出一个可用性较强的程序,我们必须要创建一个更友好的用户界面。这样的界面会使交互式的数据输入更轻松,并且减轻了用户错误输入的影响。
初步实现
老师又叫了一个同学上去修改这个程序。这个同学修改后的程序如下:
num = int(input('请输入一个三位数:'))
if not(num in range(100,1000)):
print('输入错误!')
else:
a = num // 100 #百位
b = num // 10 % 10 #十位
c = num % 10 #个位
if(num == pow(a,3) + pow(b,3) + pow(c,3)):
print("%d是水仙花数" %num)
else:
print("%d不是水仙花数" %num)
下面给出一组输入错误的输出样例:
请输入一个三位数:1234
输入错误!
这样修改程序之后确实达到了老师的要求——提示用户输入错误。课堂上关于这一问题的讨论也就到此为止。然而,不可否认的是,修改过后的程序虽然加强了容错性,但它仍旧是个可用性不强的程序。这体现在两个方面:第一,程序只可以进行一次水仙花数的判断,用户想要再一次进行判断的话需要重新Run Module;第二,假使用户不慎输入错误,没有输入一个三位数,那么程序也会就此结束,不会给用户重新输入的机会。针对这两点问题,我们又该如何改进呢?
改进——创建更为友好的用户界面
对于上面所说的第一个问题,我们可以给程序加上一个while True:
的无限循环。想要终止这个程序的话,我们只需要按Ctrl+C键。当然,更好的做法是在程序的最后加上一个if判断语句:如果用户输入“Y”的话,程序会继续下一次的运行;如果用户输入“N”的话,程序结束运行。
第二个问题又该如何解决呢?我在第一时间想到的是while循环,如果用户输入错误的话,程序执行while循环,并给用户重新输入的机会。不过,由于刚开始有些大脑短路,我并没有将这一想法用代码来实现,实在是有点蠢……
最终用Python 3.6实现如下:
while True:
num = int(input('请输入一个三位数:'))
while(num not in range(100,1000)):
num = int(input('输入错误,请重新输入:'))
a = num // 100 #百位
b = num // 10 % 10 #十位
c = num % 10 #个位
if(num == pow(a,3) + pow(b,3) + pow(c,3)):
print("%d是水仙花数" %num)
else:
print("%d不是水仙花数" %num)
j = input('您是否想要继续?(Y/N)')
while(j != 'Y' and j != 'N'):
j = input('输入错误,请重新输入:')
if(j == 'Y'):
continue
else:
print('再见!')
break
下面给出一组详细的输出样例:
请输入一个三位数:1234
输入错误,请重新输入:123
123不是水仙花数
您是否想要继续?(Y/N)Y
请输入一个三位数:153
153是水仙花数
您是否想要继续?(Y/N)Y
请输入一个三位数:100
100不是水仙花数
您是否想要继续?(Y/N)M
输入错误,请重新输入:N
再见!
显然,这样改进之后,我们用代码成功地实现了“创建更为友好的用户界面”的想法。
写在最后
有这样一句话:程序的核心部分往往只占20%,其余的80%都是为了增强它的容错性和可用性。我们学习编程也有一段时间了,在设计程序的时候,我们又是否考虑过程序的可用性呢?我想,大部分人应该都不会去想这个问题,或者是想到了这个问题却又没有用代码来实现。从今天开始,我们是不是应该要思考一下,如何让自己的程序对使用者更为友好呢?
如果有什么想法的话,欢迎联系我,我期待着你们的留言!
我的邮箱:[email protected]