如何在Python中打破嵌套的for循环?

5

我想知道如何从以下循环中跳出:

for a in range(95):
    for b in range(95):
        for c in range(95):
            for d in range(95):
                ...
                do some computings
                ...
                if condition:
                    task completed

完成任务后,所有循环和计算都会继续进行。它们必须被打破,但我不知道怎么做——在“任务完成”之后使用单个break语句只会结束最内层的for循环,但是它将被多次调用——所以我们什么也得不到。
在C中,我会这样写:a=b=c=d=95,但在Python中,这样做行不通。当然,我可以使用while循环,但是那样我就必须使用X+=1语句,而且看起来很难看。
有什么帮助吗?
关于循环: 我用它来通过暴力破解来打破一个四位密码。这不是真正的目的——只用于测试。

13
将其分成一个方法,然后从该方法返回。 - Sayse
1
或者你可以将整个代码块放在 try ... except 块中,并 raise 一个异常来跳出最内层的循环。然而,Sayse 的解决方案更加简洁。 - Roberto Reale
2个回答

12

使用 itertools product:

from itertools import product
for a, b, c, d in product(range(95), range(95), range(95), range(95)):
    print a, b, c, d
    if a == 1: break

简短版本,感谢Ashwini:

for a, b, c, d in product(range(95), repeat=4):
    print a, b, c, d
    if a == 1: break

5
product(range(95), repeat=4)... - Ashwini Chaudhary
2
我最喜欢这个。循环通常不需要嵌套。 - RemcoGerlich
看起来非常不错。可能这就是我一直在寻找的 - 而且它还可以减少缩进! - user3616181
1
另外要补充的是:有时候你可以将循环和if/break拆分成一个具有信息性名称的生成器。这里有一个关于Python循环的很酷的视频:http://nedbatchelder.com/text/iter.html - RemcoGerlich

4

您可以使用异常来跳出嵌套循环:

class Break(Exception): pass

try:
    for a in range(95):
        for b in range(95):
            for c in range(95):
                for d in range(95):
                    # ...
                    # do some computings
                    # ...
                    if condition:
                        # task completed
                        raise Break()
except Break:
    # do some stuff

或者使用 StopIteration
try:
    for a in range(95):
        for b in range(95):
            for c in range(95):
                for d in range(95):
                    # ...
                    # do some computings
                    # ...
                    if condition:
                        # task completed
                        raise StopIteration()
except StopIteration:
    # do some stuff

我认为通常使用异常来进行流程控制是一个不好的想法。 - Jan Spurny
1
这在 Python 中是惯例。 - khelwood
2
在这种情况下,“StopIteration”异常最适合使用:https://docs.python.org/2/library/exceptions.html#exceptions.StopIteration - Don
谢谢,我不知道那个。 - semptic
我不确定在循环体中引发StopIteration(而不是迭代器本身)是否是一个很好的设计。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接