You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改点

  1. 异常捕获:在每个数字输入的地方加入try-except块,捕获float()转换时的ValueError,提示用户输入有效内容,程序不会崩溃。
  2. 空列表处理:增加了对未输入任何数字情况的判断,避免出现索引错误或无意义的计算。
  3. 除零防护:除法运算中增加了除数为零的判断,避免触发ZeroDivisionError。
  4. 代码简化:将原来的四个数字列表合并为一个num_list,减少冗余;用break替代exit(),逻辑更清晰。

内容的提问来源于stack exchange,提问作者Local man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:43:14