下面是我的代码,用于求解给定用户输入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()发布于 2015-05-20 04:56:22
在用户输入随机字符串并导致ValueError之前,这是非常好的。一旦发生这种情况,我的代码就不想返回以检查输入是否是下一个。
好像你想要 statement
try:
b = float(raw_input())
except ValueError:
print "Not a valid input. Try again.\n"
continuecontinue语句将您带回到while循环的开始(下一次迭代)。目前,您正在调用quadratic2(),这使得您的函数是递归的,而不是您想要的。
因为它是递归的,所以当收到异常时,它退出当前函数,但由于使用递归,您只需返回到位于中间的前一个函数(,也就是相同的函数)。因此,您输入的下一个输入可以被解析。
b = float(raw_input())而不是
a = (raw_input())发布于 2015-05-20 05:29:23
解决问题的“真正”解决方案首先是不要使用深度嵌套的构造。深度嵌套的语句使您的代码难以阅读、测试、维护和重用。此外,您将倾向于重复代码,这是不好的。特别是在Python中,深度嵌套会导致计算空格以获得正确的缩进,这确实令人头疼。
将代码分解为函数,并遵循“单一责任原则”,让一个函数做一件事情。这有几个优点:
return,因此在许多情况下可以避免嵌套。在您的例子中,quadratic2函数做了很多事情:
现在我并不是说对于上面列出的每一个细节都需要一个函数,但是很明显,这个函数做的太多了。
关于如何分解它的例子:
float,并调用这三次,而不是重复三次try...except代码。这有一个额外的好处,您可以增强此函数以在循环中运行,这样用户就被要求为一个值重复输入,而不必像当前解决方案那样重新开始。其他贴士:
else之后使用return、raise、break或continue。这是不必要的,因为下一条语句无论如何都不会到达,而且您可以保存一个嵌套级别。1==1或1==0这样的令人困惑的表达式。这只是编写True和False的一种复杂方式。在您的示例中,应该阅读while True和return False。https://stackoverflow.com/questions/30340473
复制相似问题