¿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)
“`
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 serinput = int(input())
.Necesitamos usar
while True
en lugar dewhile 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)
:Aquí, hemos eliminado el parámetro
input
de la funcióntrytrytryagain
, ya que usaremos la funcióninput()
incorporada de Python dentro de la función misma. También hemos corregido el buclewhile
y el bloquetry
.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!