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
问题原因
eval()的安全与功能缺陷:eval()会把输入字符串当作Python代码执行,输入未定义的标识符(如sgafdf)时会触发NameError;即便输入字符串字面量,eval()返回字符串类型,但它无法处理非合法表达式的输入,风险极高。- 递归返回值丢失:当前代码中递归调用
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
相关产品推荐
相关产品推荐

