二次公式脚本出错

时间:2017-10-05 21:16:33

标签: python

我正在创建一个脚本,您可以在其中输入a,b和c到二次公式中,它将为您提供答案。

它说我运行时没有定义b。

from cmath import sqrt
qf = lambda a, b, c: (-b-cmath.sqrt((b**2) - (4*a*c)))/(2*a), (-b+cmath.sqrt((b**2) - (4*a*c)))/(2*a)
a, b, c = input('Enter a, b and c with spaces in between the values \n').split()
a = float(a) ; b = float(b) ; c = float(c)
Print(qf(a, b,c)

追踪(最近一次通话):   文件" /storage/emulated/0/Download/.last_tmp.py" ;,第2行,在     qf = lambda a,b,c:( - b-cmath.sqrt((b 2) - (4 * a * c)))/(2 * a),( - b + cmath.sqrt(( b 2) - (4 * a * c)))/(2 * a) NameError:name' b'未定义

2 个答案:

答案 0 :(得分:0)

检查出来:

from math import sqrt

def get_roots(a, b, c):
    if a == 0:
        raise ZeroDivisionError('Not a quadratic equation')
    val = b ** 2  - 4 * a * c
    if val < 0:
        raise Exception('Imaginary Roots')
    val = sqrt(val)
    root1 = (-b - val) / (2 * a)
    root2 = (-b + val) / (2 * a)
    return root1, root2

a, b, c = input('Enter a, b and c with spaces in between the values \n').split()
a, b, c = float(a), float(b), float(c)
print(get_roots(a,b,c))

答案 1 :(得分:0)

Lambda函数只能返回一个内容,因此您需要通过添加封闭的()[]将输出分组为元组或列表。 python解析器到达:

qf = lambda a, b, c: (-b-sqrt((b**2) - (4*a*c)))/(2*a)

并假设lambda函数结束。然后它开始阅读:

, (-b+sqrt((b**2) - (4*a*c)))/(2*a)

并尝试解释全局范围内的-b(它不存在的地方)这会给你的名字错误。如果你要摆脱所有的变量,并暂时假装二次公式的第二个结果总是0,你得到一个元组,第一个元素是lambda函数,第二个元素是整数0

>>>qf = lambda a, b, c: [(-b-sqrt((b**2) - (4*a*c)))/(2*a),0
>>>qf
(<function <lambda> at 0x000002B44EF72F28>, 0)

这并不能完全满足您的需求,因为您需要单个函数而不是两个单独函数的元组来分别计算每个根。

如果你想让lambda返回一个列表,那么这就是它的样子:

qf = lambda a, b, c: [(-b-sqrt((b**2) - (4*a*c)))/(2*a), (-b+sqrt((b**2) - (4*a*c)))/(2*a)]