Give the following code (does not work):
while True: #snip: print out current state while True: ok = get_input("Is this ok? (y/n)") if ok.lower() == "y": break 2 #this doesn't work :( if ok.lower() == "n": break #do more processing with menus and stuff
Is there any way to make this work? Or, if the user is satisfied, do I have to do a check to break the input loop and then another (more limited) check to break the external loop together?
#1 building
Similar to the previous, but more compact. (Booleans are just numbers)
breaker = False #our mighty loop exiter! while True: while True: ok = get_input("Is this ok? (y/n)") breaker+= (ok.lower() == "y") break if breaker: # the interesting part! break # <--- !
#2 building
I'm here because I have an external loop and an internal loop, as follows:
for x in array: for y in dont_use_these_values: if x.value==y: array.remove(x) # fixed, was array.pop(x) in my original answer continue do some other stuff with x
As you can see, it doesn't actually go to the next x, it goes to the next y.
I found that the only way to solve this problem is to traverse the array twice:
for x in array: for y in dont_use_these_values: if x.value==y: array.remove(x) # fixed, was array.pop(x) in my original answer continue for x in array: do some other stuff with x
I know this is a specific issue for OP, but I want to publish it to help someone think about their issues in a different way, while keeping it simple.
#3 building
If both conditions hold, why not continue the cycle? I think it's a more Python way:
dejaVu = True while dejaVu: while True: ok = raw_input("Is this ok? (y/n)") if ok == "y" or ok == "Y" or ok == "n" or ok == "N": dejaVu = False break
Is it right?
All the best.
#4 building
Try using the infinite generator.
from itertools import repeat inputs = (get_input("Is this ok? (y/n)") for _ in repeat(None)) response = (i.lower()=="y" for i in inputs if i.lower() in ("y", "n")) while True: #snip: print out current state if next(response): break #do more processing with menus and stuff
#5 building
# this version uses a level counter to choose how far to break out break_levels = 0 while True: # snip: print out current state while True: ok = get_input("Is this ok? (y/n)") if ok == "y" or ok == "Y": break_levels = 1 # how far nested, excluding this break break if ok == "n" or ok == "N": break # normal break if break_levels: break_levels -= 1 break # pop another level if break_levels: break_levels -= 1 break # ...and so on