python判断输入的是否为一个数字_python,如何判断输入的内容是不是数字(字符串),如果不是重新输入?...

(二更,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,表示有错误

........

另外,题主的老师给的答案应该没有判断是不是数字,当然答主的老师也不一定就是错的,因为如果是做题目的话要注意看题目的要求,比如说题目限定了一定是合法的正整数,那就不要紧,题主也不用判断是不是数字了;如若没有明显的要求,或者是题主要把程序发给用户,最好还是写一下判断,以免题目坑你,或者是用户坑你(可以查查著名的“测试工程师进酒吧”的笑话)。不过,题主能主动想出非数字的情形,对程序进行了更全面的测试,这本身值得肯定!哪怕是初学者,也要抓好测试这一关。程序本身简单,但考虑到方方面面实属不易,希望题主能继续对题目或需求刨根究底,做出更完美的程序!

说了一段跑题的废话。以上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值