Python如何校验用户输入:仅允许0-100数字并解决int转换报错
问题描述
运行成绩统计程序时,若输入非数字内容会直接抛出ValueError: invalid literal for int() with base 10: 'a'类错误,需要完成两个优化:
- 修复非数字输入导致的程序崩溃问题
- 限制输入的分数值必须在0到100的合法范围内
原有代码如下:
print("please enter your 5 marks") #read 5 inputs mark1 = int(input("enter mark 1: ")) mark2 = int(input("enter mark 2: ")) mark3 = int(input("enter mark 3: ")) mark4 = int(input("enter mark 4: ")) mark5 = int(input("enter mark 5: ")) #create array/list with five marks marks = [mark1, mark2, mark3, mark4, mark5] #print the array/list print(marks) #calculate the sum and average sumOfMarks = sum(marks) averageOfMarks = sum(marks)/5 #display results print("The sum of your marks is: "+str(sumOfMarks)) print("The average of your marks is: "+str(averageOfMarks))
实现方案
把输入校验逻辑封装成可复用的函数,每次输入时循环校验,直到用户输入符合规则再进入下一步,避免重复写5次相同的校验代码,修改后可直接运行:
def get_valid_mark(mark_index): while True: user_input = input(f"enter mark {mark_index}: ") # 校验是否为合法整数 try: mark = int(user_input) except ValueError: print("输入无效,请输入纯数字内容!") continue # 校验数值范围 if 0 <= mark <= 100: return mark print("分数输入不合法,请输入0到100之间的数值!") print("please enter your 5 marks") # 循环读取5个合法成绩 marks = [] for i in range(1, 6): marks.append(get_valid_mark(i)) # 打印成绩列表 print(marks) # 计算总分和平均分 sumOfMarks = sum(marks) averageOfMarks = sum(marks)/5 # 输出结果 print(f"The sum of your marks is: {sumOfMarks}") print(f"The average of your marks is: {averageOfMarks}")
逻辑说明
- 输入环节用
while True做无限循环,只要输入不符合规则就会提示用户重新输入,不会因非法输入直接崩溃 try-except块专门捕获整数转换失败抛出的ValueError,针对非数字输入给出明确提示- 整数转换成功后立刻做范围判断,不符合0-100区间要求的输入也会触发重输
- 抽离公共的输入校验函数,不用为5个成绩分别写重复的校验逻辑,后续如果要调整读取的成绩数量,只需要修改循环范围即可,维护成本更低
内容的提问来源于stack exchange,提问作者Moni
相关产品推荐
相关产品推荐

