es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Intentando hacer un ciclo a través de Try y Except hasta que se introduzca la entrada correcta.

Situación:
Estoy creando un juego de “Lanzamiento de Dados” para la escuela. Tengo una función para validar la entrada del usuario sobre cuánto quieren “apostar” en esta ronda. Quiero capturar todos los errores, mientras imprimo diferentes mensajes de error según el error y vuelva a pedir la entrada de nuevo.

Problema:
Capturé todos los errores, sin embargo, no puedo encontrar la manera de anidar mi primer bloque try-except para que si se ingresa un entero dos veces, continuará capturando el error.

Aquí está mi código (el argumento de talentos se utilizará más adelante en la función):

def validar_apuesta(talents):
    """
    Valida la entrada del usuario para la apuesta, verifica las cadenas, los negativos y los números excesivamente altos
    """</p>

<pre><code># formatea la solicitud de apuestas
print('{apuesta:-<34}'.format(apuesta="¿Cuánto quieres apostar? "), end=" ")


try:
    # obtiene la entrada del usuario para la apuesta, captura los errores
    # de tipo y valor, pregunta de nuevo
    apuesta = int(input())

except:
    apuesta = int(input('La apuesta debe ser un número entero: '))


# si la apuesta es negativa o 0, imprime un error, pregunta de nuevo
while apuesta <= 0:

    # captura los errores de tipo y valor dentro del bucle
    try:
        apuesta = int(input('La apuesta no puede ser cero o negativa: '))
    except:
        apuesta = int(input('La apuesta debe ser un número entero no negativo: '))

    # si la apuesta es mayor que los talentos restantes, imprime un error, pregunta de nuevo
    while apuesta > int(talents):

        # captura los errores de tipo y valor dentro del bucle
        try:
            apuesta = int(input('La apuesta no puede ser mayor que los talentos restantes: '))
        except:
            apuesta = int(input('La apuesta debe ser un número entero y menor que los talentos restantes: '))



return apuesta
</code></pre>

<p>```

Este es el resultado de la primera iteración después de que se ingresa una cadena:

Bienvenido al juego de Lanzamiento de Dados
Talentos que tienes para jugar: 100

1 – Apuesta de Campo
2 – Apuesta de Pase
3 – Salir
Elección ————————— 1
¿Cuánto quieres apostar? — H
La apuesta debe ser un número entero:
“`

La solución:
Si se ingresa de nuevo una cadena, el bloque try-except no lo recogerá. Me gustaría que repita “La apuesta debe ser un número entero” hasta que se ingrese un entero.

Ya intenté anidar el bloque try-except dentro de un bucle while que actualiza una variable con “True” o “False” si hay o no un error, pero eso no funcionó. He intentado muchas otras cosas también, pero simplemente no puedo encontrar la manera de resolverlo. Cualquier ayuda sería muy apreciada.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para iterar el primer bloque try-except y seguir capturando errores si se ingresa un entero dos veces, puede utilizar un bucle while con una variable de bandera booleana. Así es como puede modificar el código:

    try:
        valid_input = False
        while not valid_input:
            wager = int(input())
            valid_input = True # establece la variable de bandera en True si la entrada es un entero
    
    except ValueError:
        print('La apuesta debe ser un número entero: ') # imprime un mensaje de error para una entrada inválida
    

    Con esta modificación, el bloque try-except seguirá iterando hasta que la entrada sea un entero. La variable de bandera booleana valid_input se establece inicialmente en False, y solo se volverá True cuando se ingrese un entero. Si la entrada no es un entero, el bloque except imprimirá un mensaje de error y el bucle while se repetirá hasta que se proporcione una entrada válida. Una vez que se proporciona una entrada válida, el bucle while finalizará y el código avanzará al siguiente paso.

Comments are closed.