(二更,2020.3.2)
做了部分修正,感谢@王富贵儿 在评论区的疑问!
(原答案)
谢邀。
有位答主用了try except异常处理,的确可以,不过我觉得题主可能还在初学阶段,初学阶段就用初学阶段的方式,至于异常处理之类的“高阶”语句我们暂且不谈。
首先说一下为什么会报错。我们知道input的输出都是字符串。题主输入数字(比如说12),输出的是这个数字的字符串形式(比如说“12”,这里的引号表示字符串)。外面用int转成数字是没问题的,但是一旦题主输了非数字,int函数接受到的是非数字的字符串形式,无法转成整数,自然就挂掉了。
之所以楼上答主用了try,是因为int函数如果没有接受到整数,抛出的异常就是ValueError,故有此种写法。如果我们不用异常处理,我们当然可以写一个函数进行处理。具体就是对每一个字符进行正向遍历(也就是从最左边到最右边)(这里感谢@王富贵儿 的指正),提前初始化(这里感谢@王富贵儿 的指正)一个整数变量存值。如果题主想要判断是否是数字,那么就检测到字母就跳出,exit退出程序;如果是忽略掉字母,就检测到字母就continue,直接跳到下一次循环。如果检测到数字,就把之前准备的值乘以10之后再加上那个遍历到的数字。如果有负号(当然题主这里没有负数的情形),就把值乘以-1。最后输出这个值,就是你input转成整数的结果。
考虑到说话说不清楚,我还是写代码吧:
def is_int(s):
ans = 0 # 初始化
for c in s: # 正向遍历
if '0' <= c <= '9': # 判断是不是数字
ans = ans * 10 + ord(c) - ord('0') # 累加
else:
return False # 表示出现错误
return ans
简单测试,没有问题:
In [4]: while True:
...: s = input('> ')
...: print(is_int(s))
...:
> 100
100
> 300
300
> -10
False
> 10.1
False
> 0
0
> abcd5
False
> 5a205
False
>
我认为这个才是运用目前所学能做到的程序,也就涉及到数位的概念之类的,剩下来没什么高级的语句了,也没用高端的函数。其实上面的过程可能就是int函数的实现,只是int函数无法完全满足我们的要求,我们就重新实现了一遍。
当然,如果题主想不用异常处理,又想偷懒,可以用str类的类方法isdigit,这个函数可以检测字符串是否只包含数字,连负数都会被干掉。
例如:(知乎手机版貌似写不了代码)
b = input('Please input a number:')
if not str.isdigit(b):
exit(1) # 不返回0,表示有错误
........
另外,题主的老师给的答案应该没有判断是不是数字,当然答主的老师也不一定就是错的,因为如果是做题目的话要注意看题目的要求,比如说题目限定了一定是合法的正整数,那就不要紧,题主也不用判断是不是数字了;如若没有明显的要求,或者是题主要把程序发给用户,最好还是写一下判断,以免题目坑你,或者是用户坑你(可以查查著名的“测试工程师进酒吧”的笑话)。不过,题主能主动想出非数字的情形,对程序进行了更全面的测试,这本身值得肯定!哪怕是初学者,也要抓好测试这一关。程序本身简单,但考虑到方方面面实属不易,希望题主能继续对题目或需求刨根究底,做出更完美的程序!
说了一段跑题的废话。以上。