Prueba de entrada válida Python

Así que tengo un progtwig terminado que acepta un archivo de entrada con información de cuenta bancaria y lo analiza y permite algunas utilidades diferentes.

Una de esas utilidades es agregar una transacción a la “base de datos” (solo un archivo de registro).

El progtwig solicita al usuario que ingrese ‘w’ o ‘d’ y luego una cantidad (flotante). Esto representa un depósito o retiro de X cantidad de dinero.

Me preguntaba cómo asegurarme de que el usuario ingresó ‘w’ o ‘d’ Y una cantidad (número) correcta.

Entonces, decidí que un bucle de tiempo con la condición anterior funcionaría, sin embargo, estoy teniendo problemas para que funcione al 100%

Inicialmente tuve:

while input1 is not ("w" or "d") 

donde input1 sería la primera entrada (w o d) que ingresa el usuario

Sin embargo, también quiero comprobar que existe un número.

Tuve la idea de lanzar la entrada de la cadena a un flotador, luego comprobarlo, pero no sabría cómo verificar si eso es correcto, ya que lanzar y verificar el tipo no me diría mucho.

¿Cómo podría también verificar que el usuario ingresó en algún tipo de número?

Entonces, para reiterar, me gustaría que el progtwig vuelva a solicitar una entrada si el usuario no ingresó:

A) A w o d B) A número (int / float)

Gracias

la expresión ("w" or "d") siempre se evaluará como "w" . En general, aquí quieres una in :

 while input1 not in ("w", "d"): ... 

En cuanto al manejo del caso donde la entrada es un número, este es un trabajo para una función auxiliar:

 def string_is_number(s): try: float(s) return True except ValueError: return False 

Ahora puedes usar eso con lo anterior para juntar todo:

 while (not string_is_number(input1)) and (input1 not in ("w", "d")): ... 

Que en realidad se puede simplificar un poco más:

 while not (string_is_number(input1) or (input1 in ("w", "d"))): ... 

Y ahora, un enfoque completamente diferente, puedes usar una función recursiva para este tipo de cosas. Combine eso con el manejo excepcional de Python y probablemente podríamos armar una solución bastante elegante en unas pocas líneas:

 def prog_loop(): # prompt for user's input here: input1 = raw_input("Enter a number, or 'w' or 'd':") # See if we got a number try: number = float(input1) except ValueError: # Nope, wasn't a number. Check to see if it was in our # whitelisted strings. If so, break early. if input1 in ('w', 'd'): return function_handle_w_d(input1) else: # Yes, we got a number. Use the number and exit early return function_handle_number(number) # haven't exited yet, so we didn't get a whitelisted string or a number # I guess we need to try again... return prog_loop() 

Esto funcionará siempre que su usuario no ingrese una entrada incorrecta 1000 veces.

Prueba esto:

 while True: if input1 == 'w': withdraw() elif input1 == 'd': deposite() else: continue()