Salir de un bucle while usando una función

¿Hay alguna forma de romper los bucles infinitos utilizando funciones? P.ej,

# Python 3.3.2 yes = 'y', 'Y' no = 'n', 'N' def example(): if egg.startswith(no): break elif egg.startswith(yes): # Nothing here, block may loop again print() while True: egg = input("Do you want to continue? y/n") example() 

Esto provoca el siguiente error:

 SyntaxError: 'break' outside loop 

Por favor, explique por qué sucede esto y cómo se puede solucionar.

En lo que a mí respecta, no puede llamar a break desde dentro de example() pero puede hacerlo para devolver un valor ( por ejemplo: A booleano ) para detener el bucle infinito

El código:

 yes='y', 'Y' no='n', 'N' def example(): if egg.startswith(no): return False # Returns False if egg is either n or N so the loop would break elif egg.startswith(yes): # Nothing here, block may loop again print() return True # Returns True if egg is either y or Y so the loop would continue while True: egg = input("Do you want to continue? y/n") if not example(): # You can aslo use "if example() == False:" Though it is not recommended! break 

La forma de terminar un bucle while-true sería usar break . Además, la break debe estar en el scope inmediato del bucle. De lo contrario, podría utilizar excepciones para llevar el control de la stack a cualquier código que lo maneje.

Sin embargo, a menudo vale la pena considerar otro enfoque. Si su ejemplo está realmente cerca de lo que realmente quiere hacer, es decir, dependiendo de la información del usuario, lo haría así:

 if raw_input('Continue? y/n') == 'y': print 'You wish to continue then.' else: print 'Abort, as you wished.' 

Una forma alternativa de salir de una función dentro de un bucle sería elevar StopIteration desde dentro de la función y, a excepción de StopIteration fuera del bucle. Esto hará que el bucle se detenga inmediatamente. P.ej,

 yes = ('y', 'Y') no = ('n', 'N') def example(): if egg.startswith(no): # Break out of loop. raise StopIteration() elif egg.startswith(yes): # Nothing here, block may loop again. print() try: while True: egg = input("Do you want to continue? y/n") example() except StopIteration: pass