Pergunta

I am having trouble breaking out of while loops. Here is my code

while (True):
    if (dem_arr[randx, randy] > -100):
        ticker = 0
        while stack:
            x, y = stack.pop()
            mask[x, y] = True
            for dx, dy in neighbors:
                nx, ny = x + dx, y + dy
                print ticker
                if (0 <= nx < dem_arr.shape[0] and 0 <= ny < dem_arr.shape[1] and dem_arr[x, y] > -100 and dem_arr[nx, ny] > -100 and not mask[nx, ny] and abs(dem_arr[nx, ny] - dem_arr[x, y]) <= 1):    #set elevation differnce
                    stack.append((nx, ny))  #if point is selected (true) array position gets added to stack and process runs over again
                    if ((nx, ny) not in counterStack):
                        counterStack.append((nx, ny)) 
                        dem_copy[(nx, ny)] = 8888
                        if (ticker >= 121):
                            print 'ticker ticked'
                            #if in this for loop need to break out of while stack:
                        else:
                            ticker += 1
    else:   
        print '!!!Point chosen has no data!!!'
        randx = random.randint(0, row-1)    #array begins at position 0,0
        randy = random.randint(0, col-1)
        continue

What I need to happen is if (ticker >= 121):is entered I need to break out of the while stack:and while(True).Any ideas on how to do this?

Foi útil?

Solução

A simplified example illustrating the concept of using functions to control the inner loop:

stack = range(1, 500)

def stack_loop():

    ticker = 0

    while stack:
        x = stack.pop()
        # Your implementation here
        if ticker >= 121:
            print("Ticker ticked")
            return True
        else:
            print("Ticker increased")
            ticker += 1

    return False

while True:
    if stack_loop():
        break

Move the inner loop's logic to an external function and use the return statement to control if you have to break out of the main loop or not.

Hope it helps :)

EDIT: You could also move the entire block to the function and simply return from it:

stack = range(1, 500)

def main_loop():

    while True:
        ticker = 0
        while stack:
            x = stack.pop()
            # Your implementation here
            if ticker >= 121:
                print("Ticker ticked")
                return
            else:
                print("Ticker increased")
                ticker += 1

main_loop()

Outras dicas

One possible solution is to use a variable to keep track (breakout in this case):

while (True):
    if (dem_arr[randx, randy] > -100):
        ticker = 0
        breakout = False
        while stack and not breakout:
            x, y = stack.pop()
            mask[x, y] = True
            for dx, dy in neighbors:
                nx, ny = x + dx, y + dy
                print ticker
                if (0 <= nx < dem_arr.shape[0] and 0 <= ny < dem_arr.shape[1] and dem_arr[x, y] > -100 and dem_arr[nx, ny] > -100 and not mask[nx, ny] and abs(dem_arr[nx, ny] - dem_arr[x, y]) <= 1):    #set elevation differnce
                    stack.append((nx, ny))  #if point is selected (true) array position gets added to stack and process runs over again
                    if ((nx, ny) not in counterStack):
                        counterStack.append((nx, ny)) 
                        dem_copy[(nx, ny)] = 8888
                        if (ticker >= 121):
                            print 'ticker ticked'
                            #if in this for loop need to break out of while stack:
                            breakout = True
                            break
                        else:
                            ticker += 1
    else:   
        print '!!!Point chosen has no data!!!'
        randx = random.randint(0, row-1)    #array begins at position 0,0
        randy = random.randint(0, col-1)
        continue

Consider the comments already made. In addition, think about the while loop. While True: is inherently an infinite loop. You could return to the caller from within a function, you could break in the same level as the loop, or you could replace True with an expression that starts False and becomes True under the appropriate condition.

edit: You aren't programming in Java or C anymore. No need to put parentheses around "True". :) - Or the other conditionals.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top