Python–;使用'while'、'try'、'if'和'except'语句打破深度嵌套的循环
这是我的代码,它在给定用户输入的情况下求解一个二次方程Python–;使用'while'、'try'、'if'和'except'语句打破深度嵌套的循环,python,if-statement,while-loop,nested,try-catch,Python,If Statement,While Loop,Nested,Try Catch,这是我的代码,它在给定用户输入的情况下求解一个二次方程a、b、c。但是,我想检查是否有不正确的用户输入。如果用户输入的不是浮点,则用户将面临“打印”不是有效输入的问题。请重试。\n“,然后是函数quadratic2()的循环。但是,此程序是一个较大程序的一部分,因此我希望用户可以选择键入“next”,以终止此功能并继续。我的问题是我调用了3个用户输入,但我希望“next”输入成为第一个输入,a。直到用户键入随机字符串,导致ValueError时,这种方法才能正常工作。一旦发生这种情况,我的代码就
a、b、c
。但是,我想检查是否有不正确的用户输入。如果用户输入的不是浮点,则用户将面临“打印”不是有效输入的问题。请重试。\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()
在用户输入一个随机字符串并导致ValueError之前,这种方法工作得非常好。一旦发生这种情况,我的代码就不想循环回去检查输入是否是下一个
看起来你想要的是:
continue
语句将您带回while
循环(下一次迭代)的开始。当前您正在调用quadratic2()
,这会使函数递归,而不是您想要的
因为它是递归的,当接收到异常时,它退出当前函数,但是因为使用递归,所以只需返回到位于中间的函数(<强>这是相同函数>)。因此,您键入的下一个输入可以由
b = float(raw_input())
而不是
a = (raw_input())
在用户输入一个随机字符串并导致ValueError之前,这种方法工作得非常好。一旦发生这种情况,我的代码就不想循环回去检查输入是否是下一个
看起来你想要的是:
continue
语句将您带回while
循环(下一次迭代)的开始。当前您正在调用quadratic2()
,这会使函数递归,而不是您想要的
因为它是递归的,当接收到异常时,它退出当前函数,但是因为使用递归,所以只需返回到位于中间的函数(<强>这是相同函数>)。因此,您键入的下一个输入可以由
b = float(raw_input())
而不是
a = (raw_input())
问题的“真正”解决方案不是首先使用深度嵌套的结构。深度嵌套的语句使代码难以阅读、测试、维护和重用。此外,您将倾向于重复代码,这是不好的。特别是在Python中,深度嵌套将导致您计算空格以获得正确的缩进,这真是一件让人头疼的事
将代码分解为函数,并遵循“单一责任原则”,让一个函数只做一件事。这有几个优点:
返回
,因此在许多情况下可以避免嵌套quadratic2
函数可以做很多事情:
- 它运行一个“主循环”
- 它读取用户输入的命令
- 它发出命令
- 它读取用户输入的值
- 它处理无效的用户输入
- 它做计算
- 它将结果显示回用户
- 为主回路和调度命令制作一个功能。让命令(如“next”)在单独的函数中处理
- 编写一个函数从用户处读入一个
,并调用此函数三次,而不是重复float
try…除了
代码三次之外。这样做的另一个好处是,您可以将此函数增强为在循环中运行,以便要求用户重复输入一个值,而不必像当前解决方案那样重新开始
- 在
、返回
、升高
或中断
之后,不要使用继续
。这是不必要的,因为下一个语句无论如何都不会到达,您可以保存一个嵌套级别其他
- 不要使用像
或1==1
这样令人困惑的表达式。这只是编写1==0
和True
的一种复杂方式。在您的示例中,它应该读取False
和,而True
返回False
返回