关于用Python列表存储运算结果的一些小bug
先上代码与运行过程,具体问题在后面有解释。
import math as mh
def qg(a, b, c):
rt = []
da = b * b - 4 * a * c
if da >= 0:
x1 = (-b + mh.sqrt(da)) / (2 * a)
x2 = (-b - mh.sqrt(da)) / (2 * a)
rt.append(x1)
rt.append(x2)
return rt
while True:
a = input("a:")
if a == "#":
break
b = input("b:")
c = input("c:")
RT = qg(int(a), int(b), int(c))
L = len(RT)
if RT[0] == RT[1] and L > 0:
print("方程有一个实根:")
print("x1=%6.2f" % (RT[0]))
elif RT[0] != RT[1] and L > 0:
print("方程有两个实根:")
print("x1=%6.2f,x2=%6.2f" % (RT[0], RT[1]))
else:
print("方程无实根")
这是一个求一元二次方程解的代码,具体实现非常简单,这段代码的存在也就是帮忙理解这个小bug的。
首先我们都知道,一元二次方程的解的分为三种情况:
第一种:方程有两个解。
第二种: 方程有一个解(两个相同的根)。
第三种:复数解,这种情况我们暂时不去考虑,因为这是测试bug,所以我们暂且认为它无解。
接下来就是代码实现如上。
其实非常容易发现这段代码的问题无非是在求无解的时候不是我们想要的结果。
具体原因如下:
由于列表存储,在开辟内存空间的时候,内部是没有值的。只有当你的一元二次方程有解的时候,它才会将其中的解加到列表中,也就是在这个时候列表中才不为空,而恰恰出错就是在这个位置因为在判断条件中我们使用的列表的角标进行一个访问的,所以在无解的情况下,它的列表中其实是没有任何值的,所以我们这样进行一个访问是会报错的。
解决也很简单,只要在最外层的if语句中进行一个长度判断,然后在if内部进行一个判断列表中的值是否相等,然后在得出结果即可。
温馨提示:学代码,要尽量知道它内部运行的原理,这样你的查错能力会大大提高。