39

I am using multiple nested for loops. In the last loop there is an if statement. When evaluated to True all the for loops should stop, but that does not happen. It only breaks out of the innermost for loop, and than it keeps on going. I need all loops to come to a stop if the break statement is encountered.

My code:

for i in range(1, 1001):
    for i2 in range(i, 1001):
        for i3 in range(i2, 1001):
            if i*i + i2*i2 == i3*i3 and i + i2 + i3 == 1000:
                print i*i2*i3
                break
Vader
  • 6,335
  • 8
  • 31
  • 43

4 Answers4

66

You should put your loops inside a function and then return:

def myfunc():
    for i in range(1, 1001):
        for i2 in range(i, 1001):
            for i3 in range(i2, 1001):
                if i*i + i2*i2 == i3*i3 and i + i2 + i3 == 1000:
                    print i*i2*i3
                    return # Exit the function (and stop all of the loops)
myfunc() # Call the function

Using return immediately exits the enclosing function. In the process, all of the loops will be stopped.

24

You can raise an exception

try:
    for a in range(5):
        for b in range(5):
            if a==b==3:
                raise StopIteration
            print b
except StopIteration: pass
dugres
  • 12,613
  • 8
  • 46
  • 51
  • 1
    Seems a bit odd to use an exception in this particular case (and doesn't look so nice), since the code should really be put into its own function - and `return` will then work. – CodeManX Jan 27 '14 at 13:13
  • 1
    In some cases one would still have to execute some lines of code after the loops, so I will go for the try except solution – lweingart Jan 15 '17 at 12:52
  • Underrated answer. Perfect –  Sep 02 '21 at 11:55
11

why not use a generator expression:

def my_iterator()
    for i in range(1, 1001):
        for i2 in range(i, 1001):
            for i3 in range(i2, 1001):
                yield i,i2,i3

for i,i2,i3 in my_iterator():
    if i*i + i2*i2 == i3*i3 and i + i2 + i3 == 1000:
        print i*i2*i3
        break
greole
  • 4,523
  • 5
  • 29
  • 49
2

Not sure if this the cleanest way possible to do it but you could do a bool check at the top of every loop.

do_loop = True

for i in range(1, 1001):
    if not do_loop:
        break
    for i2 in range(i, 1001):
        # [Loop code here]
        # set do_loop to False to break parent loops
andrewgrz
  • 435
  • 3
  • 6
  • I want to avoid adding more checks and loops. The current code is quite inefficient as it is. – Vader Jan 22 '14 at 20:41