Python课程项目求助:优化输入数值范围验证的循环代码
问题描述
课程项目要求编写Python程序实现以下功能:
- 让用户输入5个0-100之间的数字
- 显示这些数字
- 计算并展示数字的总和与平均值
已完成核心功能:最初的代码实现了输入、列表存储、总和与平均值计算,但缺少输入数值的范围验证;之后用多个while循环实现了范围验证,但代码重复冗余,希望采用更高效的方式——通过单条输入逻辑结合循环遍历5次来完成。
初始代码(无范围验证)
print("please enter your 5 marks below") #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 marksList = [mark1, mark2, mark3, mark4, mark5] #print the array/list print(marksList) #calculate the sum and average sumOfMarks = sum(marksList) averageOfMarks = sum(marksList)/5 #display results print("The sum of your marks is: "+str(sumOfMarks)) print("The average of your marks is: "+str(averageOfMarks))
待简化的代码(多while循环做验证)
while True: mark1 = int(input("enter mark 1: ")) if 0 < mark1 <100: break print('Please enter a number between 0 and 100') while True: mark2 = int(input("enter mark 2: ")) if 0 < mark2 <100: break print('Please enter a number between 0 and 100') while True: mark3 = int(input("enter mark 3: ")) if 0 < mark3 <100: break print('Please enter a number between 0 and 100') while True: mark4 = int(input("enter mark 4: ")) if 0 < mark4 <100: break print('Please enter a number between 0 and 100') while True: mark5 = int(input("enter mark 5: ")) if 0 < mark5 <100: break print('Please enter a number between 0 and 100')
优化实现方案
通过封装输入验证逻辑为函数,再结合for循环遍历5次来实现,既减少代码冗余,又保证输入有效性。同时加入非数字输入的异常处理,让程序更健壮。
完整优化代码
def get_valid_mark(mark_num): """获取指定序号的有效分数(0-100之间的整数)""" while True: try: mark = int(input(f"enter mark {mark_num}: ")) if 0 <= mark <= 100: # 包含0和100,更符合常规分数范围,若需排除边界可改为0 < mark < 100 return mark else: print("请输入0到100之间的数字") except ValueError: print("请输入有效的整数") # 主程序逻辑 print("请输入你的5个分数:") marks_list = [] for i in range(1, 6): valid_mark = get_valid_mark(i) marks_list.append(valid_mark) # 展示输入的分数 print("你输入的分数为:", marks_list) # 计算总和与平均值 sum_marks = sum(marks_list) average_marks = sum_marks / len(marks_list) # 用len替代固定数字5,后续修改输入数量更灵活 # 展示结果 print(f"分数总和为:{sum_marks}") print(f"分数平均值为:{average_marks:.2f}") # 保留两位小数,结果更美观
关键优化点说明
- 封装验证函数:把输入、类型校验、范围校验的逻辑打包成函数,避免重复编写5遍循环,提升代码复用性。
- 循环收集输入:用
for i in range(1,6)循环5次,每次调用函数获取有效分数并添加到列表,代码简洁高效。 - 异常处理:加入
try-except捕获非整数输入,避免程序崩溃,优化用户体验。 - 灵活计算:用
len(marks_list)替代固定数字5计算平均值,后续调整输入数量时无需修改计算逻辑。 - 格式优化:使用f-string格式化输出,代码可读性更强,结果展示更规范。
内容的提问来源于stack exchange,提问作者CycloneSteve
相关产品推荐
相关产品推荐

