¿Rompiendo mientras el bucle con la función?

Estoy tratando de hacer una función que tenga una statement if / elif, y quiero que se rompa un bucle while. La función es para un juego de aventuras de texto, y es una pregunta de sí / no. Esto es lo que he encontrado hasta ahora …

def yn(x, f, g): if (x) == 'y': print (f) break elif (x) == 'n' print (g) name = raw_input('What is your name, adventurer? ') print 'Nice to meet you, '+name+'. Are you ready for your adventure?' while True: ready = raw_input('y/n ') yn(ready, 'Good, let\'s start our adventure!', 'That is a real shame.. Maybe next time') 

Ahora no estoy seguro de si estoy usando la función correctamente, pero cuando la pruebo, dice que no puedo interrumpir la función. Entonces, si alguien pudiera ayudarme con ese problema, y ​​si pudiera ayudarme si la función y la función de llamar a la función en sí tienen un formato incorrecto, eso sería muy apreciado.

Related of "¿Rompiendo mientras el bucle con la función?"

Puedes trabajar con una excepción:

 class AdventureDone(Exception): pass def yn(x, f, g): if x == 'y': print(f) elif x == 'n': print(g) raise AdventureDone name = raw_input('What is your name, adventurer? ') print 'Nice to meet you, '+name+'. Are you ready for your adventure?' try: while True: ready = raw_input('y/n ') yn(ready, "Good, let's start our adventure!", 'That is a real shame.. Maybe next time') except AdventureDone: pass # or print "Goodbye." if you want 

Esto repite el ciclo while una y otra vez, pero dentro de la función yn() aparece una excepción que rompe el ciclo. Para no imprimir un rastreo, la excepción debe ser detectada y procesada.

Deberá cambiar la ruptura dentro de su función a una devolución, y deberá tener una statement de else en caso de que el usuario no le haya proporcionado la entrada correcta. Finalmente, debe convertir la llamada en su while loop en una sentencia if.

Esto le permitirá romper la instrucción while si el jugador ingresa el comando deseado, de lo contrario, volverá a preguntar. También actualicé su función yn para permitir que el usuario use tanto mayúsculas como minúsculas, así como sí y no.

 def yn(input, yes, no): input = input.lower() if input == 'y' or input == 'yes': print (yes) return 1 elif input == 'n' or input == 'no': print (no) return 2 else: return 0 name = raw_input('What is your name, adventurer? ') print 'Nice to meet you, %s. Are you ready for your adventure?' % name while True: ready = raw_input('y/n ') if yn(ready, 'Good, let\'s start our adventure!', 'That is a real shame.. Maybe next time') > 0: break 

La idea detrás de esto es bastante simple. La función yn tiene tres estados. O bien el usuario respondió con sí, no o no válido. Si la respuesta del usuario es sí o no, la función devolverá 1 para sí y 2 para no. Y si el usuario no proporciona una entrada válida, por ejemplo, un espacio en blanco, devolverá 0.

Dentro del while True: envolvemos la función yn (‘….’, ‘….’) con una if statement que verifica si la función yn devuelve un número mayor que 0. Porque yn devolverá 0 si el usuario nos proporciona una entrada válida, y 1 o 2 para una entrada válida.

Una vez que tenemos una respuesta válida de yn , llamamos break, eso detiene el while loop y hemos terminado.

Debe salir del bucle while dentro del propio bucle, no desde otra función.

Algo como lo siguiente podría estar más cerca de lo que quieres:

 def yn(x, f, g): if (x) == 'y': print (f) return False elif (x) == 'n': print (g) return True name = raw_input('What is your name, adventurer? ') print 'Nice to meet you, '+name+'. Are you ready for your adventure?' while True: ready = raw_input('y/n: ') if (yn(ready, 'Good, let\'s start our adventure!', 'That is a real shame.. Maybe next time')): break 

Un enfoque sería tener yn devolver un valor booleano que luego se usaría para salir del bucle. De lo contrario, una break dentro de una función no puede salir de un bucle en la función de llamada.

 def yn(x, f, g): if (x) == 'y': print (f) return True elif (x) == 'n' print (g) return False name = raw_input('What is your name, adventurer? ') print 'Nice to meet you, '+name+'. Are you ready for your adventure?' done = False while not done: ready = raw_input('y/n ') done = yn(ready, 'Good, let\'s start our adventure!', 'That is a real shame.. Maybe next time') 

Si utiliza break, puede salir del bucle incluso si no se cumple la condición para el final del bucle. No se puede romper porque ‘if / elif’ no es un bucle, es solo una statement condicional.

 a = True def b(): if input("") == "Quit": global a a == False else: pass while a == True: print('Solution')