Python嵌套while循环与条件判断的无效输入处理问题
解决Python计算器程序的输入异常崩溃问题
问题描述
我学Python才几周,写了一个收集用户输入执行加减乘除运算的程序:
- 顶层循环让用户选择运算类型(1-4对应加减乘除,输入
quit退出) - 选完运算后进入嵌套循环收集数字,输入指定关键词(sum/subtract/multiply/divide)时结束输入并计算结果
目前顶层循环的无效选项能正常处理,但嵌套循环中如果输入非数字也非指定关键词,会触发ValueError导致程序直接终止,无法继续运行。
报错信息
Traceback (most recent call last): File "myfile.py", line 27, in <module> sum_list.append(float(num)) ValueError: could not convert string to float: '如果我输入数字或关键词(sum、subtract、multiply、divide、quit)以外的内容,就会出现这个错误'
解决方案
核心思路是捕获数字转换时的异常,遇到无效输入时提示用户重新输入,而不是让程序崩溃。以下是修改后的完整代码:
import math while True: # 选择运算类型 option = input("\nВыберите программу: " "\n1) Сложение " "\n2) Вычитание " "\n3) Умножение " "\n4) Деление" "\nВведите quit для выхода." "\n> ").lower() # 数字列表初始化 num_list = [] if option in ["1", "1)", "сложение"]: print("Введите числа по одному, затем — «sum» для сложения.") while True: num_input = input("> ") if num_input == "sum": break # 捕获数字转换异常 try: num = float(num_input) num_list.append(num) except ValueError: print("Ошибка: введите корректное число или «sum» для завершения.") # 计算并输出结果 if num_list: sum_result = sum(num_list) print(f"Результат операции сложения: {sum_result}") else: print("Не было введено ни одного числа.") elif option in ["2", "2)", "вычитание"]: print("Введите числа по одному, затем — «subtract» для вычитания.") while True: num_input = input("> ") if num_input == "subtract": break try: num = float(num_input) num_list.append(num) except ValueError: print("Ошибка: введите корректное число или «subtract» для завершения.") # 处理空列表情况 if len(num_list) >= 1: subtract_result = num_list[0] - sum(num_list[1:]) print(f"Результат операции вычитания: {subtract_result}") else: print("Не было введено ни одного числа.") elif option in ["3", "3)", "умножение"]: print("Введите числа по одному, затем — «multiply» для умножения.") while True: num_input = input("> ") if num_input == "multiply": break try: num = float(num_input) num_list.append(num) except ValueError: print("Ошибка: введите корректное число или «multiply» для завершения.") if num_list: multiply_result = math.prod(num_list) print(f"Результат операции умножения: {multiply_result}") else: print("Не было введено ни одного числа.") elif option in ["4", "4)", "деление"]: print("Введите числа по одному, затем — «divide» для деления.") while True: num_input = input("> ") if num_input == "divide": break try: num = float(num_input) num_list.append(num) except ValueError: print("Ошибка: введите корректное число или «divide» для завершения.") # 处理空列表和除零情况 if len(num_list) >= 1: divisor = math.prod(num_list[1:]) if divisor == 0: print("Ошибка: деление на ноль невозможно.") else: divide_result = num_list[0] / divisor print(f"Результат операции деления: {divide_result}") else: print("Не было введено ни одного числа.") elif option == "quit": print("Выход из программы...\n...завершён.") break # 用break替代exit()更优雅 else: print("Вы не выбрали программу. Попробуйте заново.") # 去掉多余的input,顶层循环会自动重新提示 continue
关键修改点
- 异常捕获:在每个数字输入的地方加入
try-except块,捕获float()转换时的ValueError,提示用户输入有效内容,程序不会崩溃。 - 空列表处理:增加了对未输入任何数字情况的判断,避免出现索引错误或无意义的计算。
- 除零防护:除法运算中增加了除数为零的判断,避免触发
ZeroDivisionError。 - 代码简化:将原来的四个数字列表合并为一个
num_list,减少冗余;用break替代exit(),逻辑更清晰。
内容的提问来源于stack exchange,提问作者Local man
相关产品推荐
相关产品推荐

