由于异常导致终端中重复IndexError

时间:2018-09-19 17:13:47

标签: python exception input valueerror

我正在尝试解决编程任务,但遇到了一些麻烦。该任务显示为:

考虑用于计算二次方程解的常用公式: ax2 + bx + c = 0由 x = sqrt(b±b ^ 2-4−ac / 2a) 编写程序可从命令行读取a,b和c的值。使用异常处理缺少的参数,并处理b ^ 2-4ac <0

处的无效输入

我的程序如下:

from math import sqrt

import sys

try:
    a = float(sys.argv[1])
    b = float(sys.argv[2])
    c = float(sys.argv[3])
    bac = b**2 - 4*a*c
    if bac < 0:
        raise ValueError
except IndexError:
    while True:
        input("No arguments read from command line!")
        a = float(input("a = ? "))
        b = float(input("b = ? "))
        c = float(input("c = ? "))
        bac = b**2 - 4*a*c
        if bac > 0:
            break
        if bac < 0:
            while True:
                print("Please choose values of a,b,c so\
                                         that b^2 - 4ac > 0")
                a = float(input("a = ? "))
                b = float(input("b = ? "))
                c = float(input("c = ? "))
                bac = b**2 - 4*a*c
                if bac > 0:
                    break
except ValueError: 
    while True:
        input("Please choose values of a,b,c so that b^2 - 4ac > 0")
        a = float(input("a = ? "))
        b = float(input("b = ? "))
        c = float(input("c = ? "))
        if bac > 0:
            break

for i in range(-1,2,2):     # i=-1, next loop > i=1
    x = (b + i*sqrt(bac)) / (2*a)
    print("x = %.2f"%(x))

似乎工作正常,但在下面的情况下却没有:

terminal >
python quadratic_roots_error2.py
No arguments read from command line!
a = ? 1
b = ? 1
c = ? 1
Please choose values of a,b,c so that b^2 - 4ac > 0
a = ? 5
b = ? 2
c = ? -3
No arguments read from command line!    
a = ? 5
b = ? 2
c = ? -3
x = -0.60
x = 1.00

为什么程序会吐出消息“没有从命令行读取参数!”?我希望程序打印每个解决方案,其中b ^ 2-4ac> 0,并且每当b ^ 2-4ac <0时,我都希望消息“请选择a,b,c的值,以便b ^ 2-4 -ac> 0”像它一样进行打印。

3 个答案:

答案 0 :(得分:4)

为什么程序会吐出消息“没有从命令行读取参数!”?

因为它正在尝试从命令行获取参数,所以没有任何内容。

“命令行”是您键入以启动程序的命令:

python quadratic_roots_error2.py

键入命令时,您可以选择提供参数,例如:

python quadratic_roots_error2.py 5 99 1000

但是您没有这样做,因此程序会打印该消息,然后从键盘读取输入。

如果您不希望打印该消息,为什么还在那里?

答案 1 :(得分:1)

当索引1处没有任何内容时,您通过调用IndexError获得sys.argv[1]

正如John Gordon所提到的,sys.argv正在寻找在调用脚本本身时给出的输入。由于调用中没有参数,在这种情况下为python quadratic_roots_error2.py,因此索引1处的列表sys.argv中没有任何内容。您的脚本随后抛出了IndexError,并被捕获了在您的Except IndexError子句中,然后遍历代码中要求A,B和C值的部分。解决问题的最快方法是替换:

a = float(sys.argv[1])
b = float(sys.argv[2])
c = float(sys.argv[3])

具有:

a = float(input("a = ? "))
b = float(input("b = ? "))
c = float(input("c = ? "))

就像脚本中的其他地方一样。

答案 2 :(得分:0)

感谢您的回复!我已经考虑了它们,现在的代码如下所示:

try:
    a = float(sys.argv[1])
    b = float(sys.argv[2])
    c = float(sys.argv[3])
except IndexError:
    input("No arguments read from command line!")
    a = float(input("a = ? "))
    b = float(input("b = ? "))
    c = float(input("c = ? "))
try:
    for i in range(-1,2,2):
        x = (b + i*sqrt(b**2 - 4*a*c)) / (2*a)
        print("x = %.2f"%(x))
except ValueError:
    while True:
        input("Please choose values a,b,c so that b**2 - 4*a*c > 0")
        a = float(input("a = ? "))
        b = float(input("b = ? "))
        c = float(input("c = ? "))
        if b**2 - 4*a*c > 0:
            for i in range(-1,2,2):
                x = (b + i*sqrt(b**2 - 4*a*c)) / (2*a)
                print("x = %.2f"%(x))
            sys.exit(1)