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

Python二次方程求解器中a值输入函数的错误排查与修复

问题描述

我正在用Python 3开发一个二次方程求解器,编写了ask_a()函数用于获取参数a(要求a不能为0且不能是字符串):

def ask_a():
    a = input("""Please enter a:
a = """)
    a = eval(a)
    if a == 0:  
        print("Please input the correct number! ")
        ask_a()
    elif isinstance(a, str):
        print("Please input the correct number! ")
        ask_a()
    else:
        print(a)
        return a

ask_a()

但输入非数字内容时,程序抛出NameError错误,报错信息如下:

Please enter a:
a = sgafdf
Traceback (most recent call last):
  File "c:\Users\jbtua\OneDrive\Desktop\wut is this\Personal Folder\Programming Projects\Python\blank-1.py", line 15, in <module>
    ask_a()
  File "c:\Users\jbtua\OneDrive\Desktop\wut is this\Personal Folder\Programming Projects\Python\blank-1.py", line 4, in ask_a
    a = eval(a)
  File "<string>", line 1, in <module>
NameError: name 'sgafdf' is not defined
PS C:\Users\jbtua\OneDrive\Desktop\wut is this\Personal Folder\Programming Projects> & C:/Users/jbtua/AppData/Local/Programs/Python/Python310/python.exe "c:/Users/jbtua/OneDrive/Desktop/wut is this/Personal Folder/Programming Projects/Python/blank-1.py"
Please enter a:
a = a
Please input the correct number! 

Please enter a:
a = w
Traceback (most recent call last):
  File "c:\Users\jbtua\OneDrive\Desktop\wut is this\Personal Folder\Programming Projects\Python\blank-1.py", line 15, in <module>
    ask_a()
  File "c:\Users\jbtua\OneDrive\Desktop\wut is this\Personal Folder\Programming Projects\Python\blank-1.py", line 10, in ask_a
    ask_a()
  File "c:\Users\jbtua\OneDrive\Desktop\wut is this\Personal Folder\Programming Projects\Python\blank-1.py", line 4, in ask_a
    a = eval(a)
  File "<string>", line 1, in <module>
NameError: name 'w' is not defined

问题原因

  1. eval()的安全与功能缺陷:eval()会把输入字符串当作Python代码执行,输入未定义的标识符(如sgafdf)时会触发NameError;即便输入字符串字面量,eval()返回字符串类型,但它无法处理非合法表达式的输入,风险极高。
  2. 递归返回值丢失:当前代码中递归调用ask_a()时未返回结果,导致合法值无法正确传递到上层调用。

解决方案

核心优化点

  • 用安全的类型转换替代eval():使用float()尝试转换输入,配合try-except捕获转换失败的情况。
  • 修复递归返回逻辑:递归调用时必须用return ask_a()传递最终结果。
  • 明确错误提示:区分a为0和非数字的错误场景,提升用户体验。

修正后的代码

def ask_a():
    try:
        a = float(input("""Please enter a:
a = """))
        if a == 0:
            print("Please input the correct number! a cannot be 0.")
            return ask_a()
        else:
            print(a)
            return a
    except ValueError:
        print("Please input the correct number! Only numeric values are allowed.")
        return ask_a()

ask_a()

代码说明

  • try-except异常捕获:尝试将输入转为浮点数,输入非数字时触发ValueError,提示用户重新输入。
  • 递归结果传递:每次递归调用都通过return传递结果,确保最终能返回合法的a值。
  • 安全性提升:避免了eval()带来的恶意代码执行风险,仅接受数字输入。
  • 清晰的错误提示:分别提示a为0和非数字的错误,用户能明确知道问题所在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:46:12