我正在尝试创建一个简单的程序,读取一个4位数的字符串,确保它确实是4位数,确保没有非数字,然后将前两位数与前两位数分开并将它们加在一起。我可以完成所有工作,但我仍然遇到这个错误:
ValueError: invalid literal for int() with base 10:
只有当我尝试使用'456f'这样的字符串时才会发生这种情况。
我可以改变什么来解决这个问题?
代码:
s = input('please type a 4-digit integer \n')
valid = True
for c in s:
if len(s)!= 4:
valid = False
if not c.isdigit():
print (c, 'is not a valid input')
number = int(s)
firstOne = number // 100
secondOne = number % 100
sum = firstOne + secondOne
x = '/'
if valid == True:
print('your integer is ' + str(number), x, 'first two digits are ' + str(firstOne), x, 'second two digits are ' + str(secondOne), x, 'sum of two new numbers is ' + str(sum))
else:
print(len(s), 'is an invalid amount of digits')
答案 0 :(得分:4)
您正在检查所有字符是否都是数字,但此检查没有任何后果 - 即使找到无效字符也只是继续。这使代码失败并显示引用的错误消息。
我建议使用专用函数来读取重复查询的整数,直到获得有效输入:
def input_int_digits(prompt, digits=4):
while True:
s = input(prompt).strip()
if len(s) == digits and s.isdigit():
return int(s)
print("Invalid input -- {}-digit integer expected.".format(digits))
请注意,我使用str.strip()
删除了前导或尾随的whitepsace,而str.isdigit()
检查字符串的所有字符是否都是数字 - 您不需要遍历字符串。
答案 1 :(得分:3)
让我们关注这段代码:
for c in s:
if len(s)!= 4:
valid = False
if not c.isdigit():
print (c, 'is not a valid input')
number = int(s)
首先要说的是len()
检查应移到字符循环之外。
if len(s)!= 4:
valid = False
for c in s:
...
下一个要做的评论是,当您检测到非数字时,您继续执行代码,就像没有错误一样。您可能打算将valid
设置为False
。
if not c.isdigit():
print (c, 'is not a valid input')
valid = False
现在,问题的主要部分。当检测到无效输入时,您需要跳转到int
。
if valid:
number = int(s)
...
如果您想继续使用这种方法,您的代码将如下所示:
valid = True
s = input('please type a 4-digit integer \n')
if len(s)!= 4:
valid = False
print(len(s), 'is an invalid amount of digits')
if valid:
for c in s:
if not c.isdigit():
valid = False
print (c, 'is not a valid input')
if valid:
number = int(s)
firstOne = number // 100
secondOne = number % 100
sum = firstOne + secondOne
x = '/'
print('your integer is ' + str(number), x, 'first two digits are ' + str(firstOne), x, 'second two digits are ' + str(secondOne), x, 'sum of two new numbers is ' + str(sum))
说完所有这些之后,我可能会在检测到错误后立即重新组织代码以处理错误。如果您能以这种方式组织错误处理,则代码更容易理解。
s = input('please type a 4-digit integer \n')
if len(s)!= 4:
sys.exit(str(len(s)) + ' is an invalid amount of digits')
for c in s:
if not c.isdigit():
sys.exit(c + ' is not a valid input')
number = int(s)
firstOne = number // 100
secondOne = number % 100
sum = firstOne + secondOne
x = '/'
print('your integer is ' + str(number), x, 'first two digits are ' + str(firstOne), x, 'second two digits are ' + str(secondOne), x, 'sum of two new numbers is ' + str(sum))
现在,这是一个正确方向的开始,但你可以继续这样做,使代码更好,更好。 Sven's answer可以很好地说明这样一个过程最终会导致什么。
答案 2 :(得分:2)
怎么样?
...
valid = len(s) == 4 and all(c.isdigit() for c in s)
if not valid:
print (c, 'is not a valid input')
...
甚至更好(谢谢,Sven!)
...
valid = len(s) == 4 and s.isdigit()
...
答案 3 :(得分:0)
在检查isdigit时,如果字符串包含非数字但仍然在所有s上调用int(),则会打印错误消息 您需要在“不是有效输入”消息后退出程序
您可以将打印更改为
sys.exit("is not a valid input")