How to break out of multiple loops?

后端 未结 30 3334
情书的邮戳
情书的邮戳 2020-11-21 05:48

Given the following code (that doesn\'t work):

while True:
    #snip: print out current state
    while True:
        ok = get_input(\"Is this ok? (y/n)\")
          


        
相关标签:
30条回答
  • 2020-11-21 06:08

    You can define a variable( for example break_statement ), then change it to a different value when two-break condition occurs and use it in if statement to break from second loop also.

    while True:
        break_statement=0
        while True:
            ok = raw_input("Is this ok? (y/n)")
            if ok == "n" or ok == "N": 
                break
            if ok == "y" or ok == "Y": 
                break_statement=1
                break
        if break_statement==1:
            break
    
    0 讨论(0)
  • 2020-11-21 06:09
    
    keeplooping=True
    while keeplooping:
        #Do Stuff
        while keeplooping:
              #do some other stuff
              if finisheddoingstuff(): keeplooping=False
    

    or something like that. You could set a variable in the inner loop, and check it in the outer loop immediately after the inner loop exits, breaking if appropriate. I kinda like the GOTO method, provided you don't mind using an April Fool's joke module - its not Pythonic, but it does make sense.

    0 讨论(0)
  • 2020-11-21 06:09

    Factor your loop logic into an iterator that yields the loop variables and returns when done -- here is a simple one that lays out images in rows/columns until we're out of images or out of places to put them:

    def it(rows, cols, images):
        i = 0
        for r in xrange(rows):
            for c in xrange(cols):
                if i >= len(images):
                    return
                yield r, c, images[i]
                i += 1 
    
    for r, c, image in it(rows=4, cols=4, images=['a.jpg', 'b.jpg', 'c.jpg']):
        ... do something with r, c, image ...
    

    This has the advantage of splitting up the complicated loop logic and the processing...

    0 讨论(0)
  • 2020-11-21 06:09

    There is a hidden trick in the Python while ... else structure which can be used to simulate the double break without much code changes/additions. In essence if the while condition is false, the else block is triggered. Neither exceptions, continue or break trigger the else block. For more information see answers to "Else clause on Python while statement", or Python doc on while (v2.7).

    while True:
        #snip: print out current state
        ok = ""
        while ok != "y" and ok != "n":
            ok = get_input("Is this ok? (y/n)")
            if ok == "n" or ok == "N":
                break    # Breaks out of inner loop, skipping else
    
        else:
            break        # Breaks out of outer loop
    
        #do more processing with menus and stuff
    

    The only downside is that you need to move the double breaking condition into the while condition (or add a flag variable). Variations of this exists also for the for loop, where the else block is triggered after loop completion.

    0 讨论(0)
  • 2020-11-21 06:12

    Solutions in 2 Ways

    With an example: Are these two matrices equal/same?
    matrix1 and matrix2 are same size, n, 2 dimentional matrices.

    First Solution, without a function

    same_matrices = True
    inner_loop_broken_once = False
    n = len(matrix1)
    
    for i in range(n):
        for j in range(n):
    
            if matrix1[i][j] != matrix2[i][j]:
                same_matrices = False
                inner_loop_broken_once = True
                break
    
        if inner_loop_broken_once:
            break
    

    Second Solution, with a function
    This is the final solution for my case

    def are_two_matrices_the_same (matrix1, matrix2):
        n = len(matrix1)
        for i in range(n):
            for j in range(n):
                if matrix1[i][j] != matrix2[i][j]:
                    return False
        return True
    

    Have a nice day!

    0 讨论(0)
  • 2020-11-21 06:12
    # this version breaks up to a certain label
    
    break_label = None
    while True:
        # snip: print out current state
        while True:
            ok = get_input("Is this ok? (y/n)")
            if ok == "y" or ok == "Y":
                break_label = "outer"   # specify label to break to
                break
            if ok == "n" or ok == "N":
                break
        if break_label:
            if break_label != "inner":
                break                   # propagate up
            break_label = None          # we have arrived!
    if break_label:
        if break_label != "outer":
            break                       # propagate up
        break_label = None              # we have arrived!
    
    #do more processing with menus and stuff
    
    0 讨论(0)
提交回复
热议问题