Python:不使用全局变量,解决函数调用时root1未定义问题
问题解决:NameError: name 'root1' is not defined
核心问题
你调用Print函数时传入的root1和root2在当前作用域未定义——QuadRoots函数的返回值没有被正确解构提取,导致这两个变量根本不存在。另外代码还有两个隐性问题:循环内重复定义函数、输出时系数顺序颠倒(和你预期的输出格式不符)。
修复方案
- 将函数移至
main外部:避免在循环中反复定义函数,提升代码效率和可读性。 - 正确解构
QuadRoots的返回值:根据返回值的长度和第一个元素的标识,提取对应的根变量。 - 调整输出的系数顺序:匹配你给出的示例输出格式(A作为二次项系数,B作为一次项系数)。
- 优化
Print函数参数:无需单独传入root1和root2,直接利用QuadRoots的返回结果处理输出,减少参数冗余。
修正后的完整代码
import math def GetInputs(): numA = int(input("What is coefficient A?")) numB = int(input("What is coefficient B?")) numC = int(input("What is coefficient C?")) return numA, numB, numC def QuadRoots(numA, numB, numC): if numA == 0: return (-1,) discriminant = numB ** 2 - 4 * numA * numC if discriminant < 0: return (-2,) elif discriminant > 0: numnegB = -numB sqrt_disc = math.sqrt(discriminant) root1 = (numnegB + sqrt_disc) / (2 * numA) root2 = (numnegB - sqrt_disc) / (2 * numA) return (0, root1, root2) else: numnegB = -numB root1 = numnegB / (2 * numA) return (1, root1) def Print(numA, numB, numC, result): equation_str = f"{numA}x^2 + {numB}x + {numC}" kind = result[0] if kind == -1: print("This is a line; not a Quadratic Equation.") elif kind == -2: print(f"{equation_str} has no solution.") elif kind == 0: root1, root2 = result[1], result[2] print(f"{equation_str} has solutions {root1} and {root2}.") elif kind == 1: root1 = result[1] print(f"{equation_str} has unique solution {root1}.") def main(): while True: numA, numB, numC = GetInputs() result = QuadRoots(numA, numB, numC) Print(numA, numB, numC, result) askuser = input("Do you want to solve another equation? Type Y for yes and N for no:") if askuser.lower() == "n": print("Goodbye!") break elif askuser.lower() == "y": continue else: print("Please type Y or N") break main()
关键修复点说明
- 所有函数都移到
main外部,避免循环内重复定义。 QuadRoots的返回值统一用元组格式,方便后续判断和解构。Print函数接收QuadRoots的返回元组,根据第一个元素判断方程类型,再提取对应根。- 用f-string简化输出字符串的拼接,同时修正了系数顺序,确保输入1、3、2时输出正确的
1x^2 + 3x + 2 has solutions -1.0 and -2.0.。 - 调用
Print时不再需要传入未定义的root1和root2,而是传入完整的结果元组。
内容的提问来源于stack exchange,提问作者axpxvaiah
相关产品推荐
相关产品推荐

