这是我的代码,它解决了给定用户输入a, b, c
的二次方程式。但是,我想检查不正确的用户输入。如果用户输入除浮动之外的任何内容,则用户将遇到print "Not a valid input. Try again.\n"
,然后是函数quadratic2()
的循环。但是,此程序是较大程序的一部分,因此我希望用户可以选择键入"next"
来终止此功能并继续。我的问题是我要求3个用户输入,但我希望"next"
输入是第一个输入a
。这非常有效,直到用户输入随机字符串,导致ValueError
。一旦发生这种情况,我的代码不想循环回来检查输入是否为next
。请帮我!我认为这个代码嵌套的方式让我感到困惑。
def retest3():
print "Type in another a, b, and c. Or type \"Next\" to move on."
def quadratic1():
print ("This program calculates the zeroes of a quadratic equation."
"\nPlease enter a, b, and c, hitting \"Enter\" after each one: ")
def quadratic2():
while 1 == 1:
a = (raw_input())
if "next" == a.lower():
ontonextthing()
return 1 == 0
else:
try:
a = float(a)
except ValueError:
print "Not a valid input. Try again.\n"
quadratic2()
try:
b = float(raw_input())
except ValueError:
print "Not a valid input. Try again.\n"
quadratic2()
try:
c = float(raw_input())
except ValueError:
print "Not a valid input. Try again.\n"
quadratic2()
if b**2-4*a*c>0:
root1=(-b+math.sqrt(b**2-4*a*c))/(2*a)
root2=(-b-math.sqrt(b**2-4*a*c))/(2*a)
print ("First Root: {0}\nSecond Root: {1}".format(root1,root2))
else:
print ("The discriminant is negative, so your"
" roots will contain \"i\".")
disc1=(b**2-4*a*c)
disc2=-disc1
sqrtdisc2=(math.sqrt(disc2))/(2*a)
b2=(-b)/(2*a)
print ("{0} + {1}i".format(b2, sqrtdisc2))
print ("{0} - {1}i\n".format(b2, sqrtdisc2))
retest3()
quadratic1()
quadratic2()
答案 0 :(得分:3)
这非常有效,直到用户输入随机字符串,导致ValueError。一旦发生这种情况,我的代码不想循环回来检查输入是否是下一个。
好像你想要continue
statement:
try:
b = float(raw_input())
except ValueError:
print "Not a valid input. Try again.\n"
continue
continue
语句将您带回while
循环的开头(下一次迭代)。目前你正在调用quadratic2()
,它使你的函数递归,而不是你想要的。
因为它是递归的,当你收到你的Exception它会退出当前函数,但因为你正在使用递归,你只需返回到你在中间的前一个函数(这是相同的函数)。因此,您键入的下一个输入可以通过
进行解析b = float(raw_input())
而不是
a = (raw_input())
答案 1 :(得分:1)
"真实"您的问题的解决方案是首先不要使用深层嵌套的构造。深度嵌套的语句使您的代码难以阅读,难以测试,难以维护且难以重用。此外,您将倾向于复制代码,这是不好的。特别是在Python中,深度嵌套会让你计算空格以使缩进正确,这实际上是一个痛苦的问题。
将代码分解为函数,并遵循"单一责任原则"通过让一个函数完成一件事。这有几个好处:
return
,所以你可以在很多情况下避免嵌套。在您的情况下,quadratic2
函数执行了很多操作:
现在我并不是说你需要一个函数用于上面列出的每个细节,但很明显这个函数做得太多了。
有关如何分解的示例:
float
中读取的函数,并将其调用三次,而不是重复三次try...except
代码。这样做的另一个好处是,您可以增强此功能以在循环中运行,以便要求用户重复输入一个值,而不必像当前解决方案那样重新开始。其他提示:
else
,return
或raise
之后使用break
。没有必要,因为无论如何都不会达到下一个语句,你可以保存一个嵌套级别。continue
或1==1
等令人困惑的表达方式。这只是撰写1==0
和True
的复杂方式。在您的示例中,它应该改为False
和while True
。