【问题标题】:How To End A Loop When A Condition is Satisfied?条件满足时如何结束循环?
【发布时间】:2019-04-10 09:39:59
【问题描述】:

根据我之前的问题here,我今天的问题与它有关。我有一个不断更新的全局变量,我将该变量传递给一个函数。该函数由循环和条件语句组成。我希望在满足条件时结束循环,但它会继续循环。

这是我的代码。

class LetterAScreen:
    def identity(self): 
        global where
        lol=Identifier()
        lol.fn_compare()
        print where

    def verifier(self):
        global where
        verify=where
        if verify != 1:
            while (count>0):
                print ("try again")
                run=LetterAScreen()
                run.identity()
                run.verifier
                print ("try again")
                count += 1
        else:
            print ("correct")

“正确”是指变量变为 1 时。否则,不正确,用户应重试。输出最终看起来像这样。

#incorrect inputs
19
try again
try again
19
try again
try again
19
try again
try again
19
try again
try again
19
try again
try again
#correct inputs but loop doesn't end
1
try again
try again
1
try again
try again
1
try again
try again
1
try again
try again

关于 Identifier 类的基本部分只是更新变量。我相信问题出在我分享的课程上。我真的不熟悉这是如何工作的。我希望你能帮助我。

【问题讨论】:

  • 我不确定你的代码细节,但你可以使用break 关键字来跳出循环。例如,您可以使用if ...: break,将... 替换为允许退出循环的条件。
  • 如果你继续添加到count,它永远不会爆发。
  • 只有当if condition 为真时,我如何才能跳出循环?我尝试在最后添加中断,但即使输入不正确,它也会结束循环。

标签: python python-2.7 function loops


【解决方案1】:

这里有几点需要注意:

  • 为什么要在循环中创建一个新的 LetterAScreen 对象?
  • 使用全局变量时要小心,通常还有其他方法可以解决这个问题。

我不知道Identifier 类做什么,但猜想该类的fn_compare 函数会改变where 变量?此外,在每次调用 identity 函数时创建一个新的 Identifier 似乎您应该更改。

话虽如此,verifier 方法需要调整如下:

def verifier(self):
    global where
    count = 1
    while (count>0 and where != 1):
        print ("try again")
        self.identity()
        count += 1
    print ("correct")

您不应该将全局where 变量分配给本地变量,这会导致问题,因为本地变量不会在循环中更新。您可以直接与此全局 where 变量进行比较。我还删除了run 变量,您在LetterAScreen 类的实例中执行,因此您可以在self 对象上调用identity 方法(类似于JS 中的this)。

【讨论】:

  • 输入正确时如何结束循环?我在我的代码中包含了你的评论,但似乎我只是重构了我的语法。谢谢。
  • 输入正确,我假设您的意思是验证 = 1?所以它不会进入循环。
  • 输入来自全局 where 变量,该变量每 1 秒更新一次。我添加了一个 if 条件,这样如果输入不是 1,它将不得不一遍又一遍地循环,直到输入为 1,到那时它可能会中断循环。抱歉,我是 Python 新手。
  • 我再次阅读了你的问题并相应地调整了我的答案
【解决方案2】:

首先,您可能不需要在方法“验证器”中创建新实例(创建实例时已调用方法,您可以使用“self”变量访问实例。 所以而不是

run=LetterAScreen()
run.identity()

self.identity()

也不是使用复杂的“全局”方法 您可以创建实例变量,如 self.verify 并在“identify”中更改它

class LetterAScreen:
    def __init__(self):
        self.verify = 0

通常也是这样创建的不定式循环

while True:

总是小心使用“全局”是很棘手的,在大多数情况下,你可以用简单易读的方式做任何事情,所以我建议你从这个脚本中删除所有全局变量,你可以从函数返回参数,使用可变对象等.

【讨论】:

  • 输入正确时如何结束循环?我在我的代码中包含了你的评论,但似乎我只是重构了我的语法。
  • if self.verify: break
猜你喜欢
  • 1970-01-01
  • 2012-02-21
  • 2021-11-25
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多