Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python–;使用'while'、'try'、'if'和'except'语句打破深度嵌套的循环_Python_If Statement_While Loop_Nested_Try Catch - Fatal编程技术网

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
    解决问题的“真正”方法是首先不要使用深度嵌套的结构。深度嵌套的语句使代码难以阅读、测试、维护和重用。此外,您将倾向于重复代码,这是不好的。特别是在Python中,深度嵌套将导致您计算空格以获得正确的缩进,这真是一件让人头疼的事

    将代码分解为函数,并遵循“单一责任原则”,让一个函数只做一件事。这有几个优点:

  • 你不必把太多的事情记在心里。专注于一个小问题,然后解决它
  • 您可以随时
    返回