如何停止 While 循环?[已结束]

How can I stop a While loop? [closed]

提问人:NONEenglisher 提问时间:12/15/2008 最后编辑:Karl KnechtelNONEenglisher 更新时间:1/13/2023 访问量:261609

问:


这个问题是由一个错别字或一个无法再重现的问题引起的。虽然类似的问题可能在这里成为主题,但这个问题的解决方式不太可能帮助未来的读者。

10个月前关闭。

我在一个函数中写了一个,但不知道如何停止它。当它不满足其最终条件时,循环就会永远持续下去。我怎样才能阻止它?while loop

def determine_period(universe_array):
    period=0
    tmp=universe_array
    while True:
        tmp=apply_rules(tmp)#aplly_rules is a another function
        period+=1
        if numpy.array_equal(tmp,universe_array) is True:
            break    #i want the loop to stop and return 0 if the 
                     #period is bigger than 12
    if period>12:  #i wrote this line to stop it..but seems it 
                   #doesnt work....help..
        return 0
    else:   
        return period
python while循环

评论

4赞 12/15/2008
问题出在你的问题中。“当它不满足其最终条件时..”。你不是在测试最终条件,你是在说“虽然是真的:”。True 将永远是 True。
1赞 NONEenglisher 12/15/2008
感谢您的评论,我只知道一半关于while loop。所以真的不知道如何问一个好问题。
1赞 Karl Knechtel 1/13/2023
这里的问题是由拼写错误引起的 - 不正确的缩进 - 如顶部/接受的答案所示。另一位编辑迅速出现并“修复”了缩进,破坏了示例并使代码在功能上与答案中的代码相同,因此该问题毫无意义。我已经解决了这个问题;但该问题仍应关闭和删除,因为它没有涉及所询问的主题,并且具有积极的误导性。它最初应该由于拼写错误而被关闭,或者被路由到一些关于缩进的一般问题。
0赞 Karl Knechtel 1/13/2023
我们现在有一个规范,它讨论了 Python 中缩进的目的,但 a) 它面向解析而不是无效逻辑;b) OP当时似乎已经理解了必要的原则;c) 如果被欺骗,作为路标,这将是完全荒谬的。IndentationError

答:

25赞 Mapad 12/15/2008 #1

只需正确缩进代码即可:

def determine_period(universe_array):
    period=0
    tmp=universe_array
    while True:
        tmp=apply_rules(tmp)#aplly_rules is a another function
        period+=1
        if numpy.array_equal(tmp,universe_array) is True:
            return period
        if period>12:  #i wrote this line to stop it..but seems its doesnt work....help..
            return 0
        else:   
            return period

您需要了解示例中的语句将退出您使用 创建的无限循环。因此,当中断条件为 True 时,程序将退出无限循环并继续到下一个缩进块。由于代码中没有 following 块,因此函数结束并且不返回任何内容。因此,我通过用语句替换语句来修复您的代码。breakwhile Truebreakreturn

按照你的想法使用无限循环,这是最好的写法:

def determine_period(universe_array):
    period=0
    tmp=universe_array
    while True:
        tmp=apply_rules(tmp)#aplly_rules is a another function
        period+=1
        if numpy.array_equal(tmp,universe_array) is True:
            break
        if period>12:  #i wrote this line to stop it..but seems its doesnt work....help..
            period = 0
            break

    return period

评论

0赞 Mapad 12/15/2008
是的,因为你的代码中还有另一个错误:一个 break 语句,它阻止了你的函数返回一些东西。我现在删除了它。
0赞 NONEenglisher 12/15/2008
但它现在总是返回 0......不过非常感谢~~~你真好
1赞 nosklo 12/16/2008
不要检查 something() 是否为 True:直接检查对象,如 “if numpy.array_equal(tmp,universe_array):”
7赞 Joel Coehoorn 12/15/2008 #2
def determine_period(universe_array):
    period=0
    tmp=universe_array
    while period<12:
        tmp=apply_rules(tmp)#aplly_rules is a another function
        if numpy.array_equal(tmp,universe_array) is True:
            break 
        period+=1

    return period

评论

1赞 annakata 12/15/2008
+1,但最好指出什么+为什么,“虽然是真的”eeek
0赞 Patrick Desjardins 12/15/2008
Joel 代码循环直到周期为 12 比停止循环和返回周期......这很正常...Joel 代码不是你想要的
0赞 Joel Coehoorn 12/15/2008
这更接近。是的,我确实希望他也能为自己考虑一些。
0赞 Joel Coehoorn 12/15/2008
请注意:如果 if 条件不为真,这仍然不会返回您想要的内容。我把最后一点留给读者作为练习。
0赞 NONEenglisher 12/15/2008
@Joel Coehoorn,我不能阻止自己说你真的是一个好老师!喜欢这个形式,因为它有很多像你这样的老师。
2赞 Greg Hewgill 12/16/2008 #3

Python 中的运算符可能不会按照您的期望执行。取而代之的是:is

    if numpy.array_equal(tmp,universe_array) is True:
        break

我会这样写:

    if numpy.array_equal(tmp,universe_array):
        break

运算符测试对象身份,这与相等性完全不同。is

-1赞 Suraj 12/17/2008 #4

我会使用 for 循环来做到这一点,如下所示:

def determine_period(universe_array):
    tmp = universe_array
    for period in xrange(1, 13):
        tmp = apply_rules(tmp)
        if numpy.array_equal(tmp, universe_array):
            return period
    return 0
-1赞 tkirk1222 6/28/2021 #5

以下是 Charles Severance 的“python or everybody”中关于在 True 循环中编写的一段示例代码:

while True:
    line = input('> ')
    if line == 'done':
        break
    print(line)
print('Done!')

这帮助我解决了我的问题!

评论

2赞 thehumaneraser 6/28/2021
嗨,@tkirk1222,欢迎来到 Stack Overflow!在回答问题时,请尽量保持你的回答尽可能笼统和切合主题,并提供更多的解释。在本例中,问题询问的是停止循环,因此您应该解释执行此操作的代码部分(语句)。其他东西可能会在没有解释的情况下误导其他人。while Truebreak