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.

¿Cómo puedo definir una función que contenga un bucle while dentro, y un bucle try-except dentro de ese bucle?

Estoy tratando de hacer una función repetible que use un bucle while para intentar repetidamente un bucle try-except, pero tengo problemas con algunas partes.
Aquí está mi función actual:

def trytrytryagain(input):
  ValueError 
  while ValueError:
    try:
      input() = int(input())
    except ValueError:
      print("Debe ingresar un número")
      input = int(input())

Cuando ejecuto el código e ingreso “a” (para probar si pide repetidamente al usuario que ingrese un número) siempre muestra este mensaje de error después de la primera iteración:

Traceback (most recent call last):
  File "main.py", line 7, in trytrytryagain
    int(input())
ValueError: invalid literal for int() with base 10: 'a'

Durante el manejo de la excepción anterior, ocurrió otra excepción:

Traceback (most recent call last):
  File "main.py", line 16, in <module>
    trytrytryagain (times_table)
  File "main.py", line 10, in trytrytryagain
    int(input())
ValueError: invalid literal for int() with base 10: 'a'

Por lo tanto, me resulta muy difícil crear esta función. Se supone que debe seguir ejecutándose hasta que el usuario ingrese un número, y mostrar el mensaje “Debe ingresar un número” después de cada iteración. Estoy totalmente confundido, por lo que este es el código completo para el contexto (es un generador de tablas de multiplicar):

“`python
from time import sleep

def trytrytryagain(input):
ValueError
while ValueError:
try:
int(input())
except ValueError:
print("Debe ingresar un número")
int(input())

print("Por favor ingrese la tabla de multiplicar que desea completar (1, 2, 3, etc.).")
times_table = input
trytrytryagain(times_table)
print("¿Le gustaría ir a otra tabla de multiplicar (hacer las tablas del 1 al 12)? Sí/No")
try:
othertables = str(input()).lower()
except ValueError:
print("Debe ingresar Sí o No")
othertables = str(input()).lower()

if othertables == "sí":
print("Ingrese la tabla de multiplicar a la que desea ir.")
try:
other_times_table = int(input())
except ValueError:
print("Debe ingresar un número")
other_times_table = int(input())
print("Ingrese la tabla máxima a la que le gustaría llegar. (si hace las tablas del 3 al 5, ¿en qué tabla de multiplicar le gustaría terminar – escriba 12 para 5 x 12, 13 para 5 x 13, etc.)")
try:
max_value = int(input())
except ValueError:
print("Debe ingresar un número")
max_value = int(input())
for x2 in range(times_table, other_times_table + 1):
for x in range(max_value + 1):

<pre><code> print(f"{x} x {x2} = ")
input()
sleep(0.1)
</code></pre>

else:
print("Está bien.")
print("Ingrese la tabla máxima a la que le gustaría llegar. (si hace las tablas del 3 al 5, ¿en qué tabla de multiplicar le gustaría terminar (escribe 12 para 5 x 12, etc.))")
try:
max_value = int(input())
except ValueError:
print("Debe ingresar un número")
max_value = int(input())
for x in range(times_table, max_value + 1):
answer = x * times_table
print(f"{x} veces {times_table} es {answer}")
sleep(0.1)
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución

    Hay algunos problemas con la función trytrytryagain(input).

    La línea ValueError dentro de la función no hace nada. No eleva una excepción ni captura cualquier excepción. Simplemente se encuentra allí como una declaración sin uso.

    La declaración input() = int(input()) debería ser input = int(input()).

    Necesitamos usar while True en lugar de while ValueError, ya que ValueError es un nombre de clase y no una variable.

    Cuando el usuario ingresa una entrada incorrecta, la función muestra correctamente el mensaje de error y solicita otra entrada, pero no devuelve el nuevo valor de entrada, lo cual es necesario para que la función funcione correctamente.

    Aquí está la versión corregida de trytrytryagain(input):

    def trytrytryagain():
        while True:
            try:
                input_value = int(input("Por favor, ingrese un número: "))
                return input_value
            except ValueError:
                print("Usted debe ingresar un número")
    
    times_table = trytrytryagain()
    print(f"Usted ingresó {times_table}")
    
    # Output:
    # Por favor, ingrese un número: a
    # Usted debe ingresar un número
    # Por favor, ingrese un número: b
    # Usted debe ingresar un número
    # Por favor, ingrese un número: 3
    # Usted ingresó 3
    

    Aquí, hemos eliminado el parámetro input de la función trytrytryagain, ya que usaremos la función input() incorporada de Python dentro de la función misma. También hemos corregido el bucle while y el bloque try.

    Ahora, cuando llamamos la función trytrytryagain(), solicita repetidamente al usuario que ingrese un número hasta que se proporcione una entrada válida. Una vez que la entrada es válida, devuelve el valor de entrada, que podemos usar en el resto del programa.

    También podemos pasar una indicación a la función input(), lo que facilita la comprensión de lo que el programa está solicitando.

    ¡Espero que esto ayude!

Comments are closed.