首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -用‘`while`’、` and‘、` of’和‘`except`’语句从深嵌套的循环中跳出

Python -用‘`while`’、` and‘、` of’和‘`except`’语句从深嵌套的循环中跳出
EN

Stack Overflow用户
提问于 2015-05-20 04:47:46
回答 2查看 1.3K关注 0票数 0

下面是我的代码,用于求解给定用户输入a, b, c的二次方程。但是,我想检查是否有不正确的用户输入。如果用户输入的是浮点以外的任何内容,则用户将面临print "Not a valid input. Try again.\n",然后是函数quadratic2()的循环。但是,这个程序是一个较大程序的一部分,所以我希望用户可以选择输入"next"来终止这个功能并继续前进。我的问题是,我需要3个用户输入,但我希望"next"输入是第一个输入,a。在用户输入随机字符串并导致ValueError之前,这是非常好的。一旦发生这种情况,我的代码就不想返回以检查输入是否为next。请帮帮我!我觉得这段代码的嵌套方式让我很困惑。

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-20 04:56:22

在用户输入随机字符串并导致ValueError之前,这是非常好的。一旦发生这种情况,我的代码就不想返回以检查输入是否是下一个。

好像你想要 statement

代码语言:javascript
复制
        try:
            b = float(raw_input())
        except ValueError:
            print "Not a valid input. Try again.\n"
            continue

continue语句将您带回到while循环的开始(下一次迭代)。目前,您正在调用quadratic2(),这使得您的函数是递归的,而不是您想要的。

因为它是递归的,所以当收到异常时,它退出当前函数,但由于使用递归,您只需返回到位于中间的前一个函数(,也就是相同的函数)。因此,您输入的下一个输入可以被解析。

代码语言:javascript
复制
b = float(raw_input())

而不是

代码语言:javascript
复制
a = (raw_input())
票数 3
EN

Stack Overflow用户

发布于 2015-05-20 05:29:23

解决问题的“真正”解决方案首先是不要使用深度嵌套的构造。深度嵌套的语句使您的代码难以阅读、测试、维护和重用。此外,您将倾向于重复代码,这是不好的。特别是在Python中,深度嵌套会导致计算空格以获得正确的缩进,这确实令人头疼。

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

  1. 你不必把太多的事情记在脑子里。专注于一个小问题,并完成它。
  2. 您可以在函数的早期使用return,因此在许多情况下可以避免嵌套。
  3. 您可以在函数中重用代码。
  4. 您没有重复的代码:如果您想要更改特定的行为,请更改一个函数,而不是一个函数中的几个位置。
  5. 您可以隔离地测试您的函数,确保它们做正确的事情。

在您的例子中,quadratic2函数做了很多事情:

  • 它运行一个“主循环”。
  • 它读取命令的用户输入。
  • 它分发命令
  • 它读取用户输入的值。
  • 它处理无效的用户输入。
  • 它做计算
  • 它将结果显示给用户。

现在我并不是说对于上面列出的每一个细节都需要一个函数,但是很明显,这个函数做的太多了。

关于如何分解它的例子:

  • 为主循环和调度命令创建一个函数。让命令(例如"next")在单独的函数中处理。
  • 编写一个函数从用户读取float,并调用这三次,而不是重复三次try...except代码。这有一个额外的好处,您可以增强此函数以在循环中运行,这样用户就被要求为一个值重复输入,而不必像当前解决方案那样重新开始。

其他贴士:

  • 不要在else之后使用returnraisebreakcontinue。这是不必要的,因为下一条语句无论如何都不会到达,而且您可以保存一个嵌套级别。
  • 不要使用像1==11==0这样的令人困惑的表达式。这只是编写TrueFalse的一种复杂方式。在您的示例中,应该阅读while Truereturn False
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30340473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档