Autor
|
Tema: ValueError en Python (Leído 5,428 veces)
|
juanfelr
Desconectado
Mensajes: 67
|
Saludos a todos los miembros de esta bella comunidad. como ya se me ha hecho costumbre, comparto los atascos que me encuentro a medida que voy aprendiendo un poco de python. En esta ocasion he realizado un codigo para generar sumas aleatorias y preguntar al usuario la respuesta. Si el valor ingresado No es entero positivo, o no es un numero me debe mostrar un mensaje de error "EEE" y volver a preguntar. si ingreso una respuesta incorrecta numerica me funciona bien, sin embargo no sucede lo mismo si ingreso texto. Tengo entendido que si la variable "answer" la denoto con un int antes de input me va a gnerar un ValueError si no ingreso un entero. Comparto el codigo para su amable observacion de algun posible error u omision. import random
def main(): level=get_level()
i=1 correct=0
while i<=10: try:
x, y = generate_integer(level) z=x+y answer=int(input(f"{x} + {y} = ")) error=0
while answer != z:
print("EEE") answer=int(input(f"{x} + {y} = ")) error+=1 if error==2: print(f"{x} + {y} = {z}") break i+=1
i+=1 correct+=1 except ValueError: pass
print("Score:",correct)
def get_level(): while True: try: level=int(input("Level: ")) if level not in [1,2,3]: raise ValueError
return level break
except ValueError: pass
def generate_integer(level): if level==1: a=random.randrange(0,9) b=random.randrange(0,9) elif level==2: a=random.randrange(10,99) b=random.randrange(10,99) else: a=random.randrange(100,999) b=random.randrange(100,999)
return a, b
if __name__=="__main__": main() No explico todo el codigo para no extender más el post, pero si requieren de más explicacion, con mucho gusto responderé. agradezco las pistas que me puedan otorgar. feliz noche PD: He intentado con while answer != z or isnumeric(answer)==False: en la linea 20 pero sin resultados.
|
|
|
En línea
|
|
|
|
reymosquito
Desconectado
Mensajes: 81
|
Hola, perdón pero es muy feo el código, igual el problema es que estás manejando excepciones y no le decís que haga algo sino que las pase con: i+=1 correct+=1 except ValueError: print("EEE")
solucionarías ese detalle Dicho sea de paso hay una sección de scripts edito: te muestro otra forma de escribir ese código, no es la mejor pero simplifica bastante: #-*- coding:utf-8 -*- from random import randint def main(): level=get_level() correct=0 error = 0 for x in range(10): x, y = generate_integer(level) z = x + y try: answer=int(input(f"{x} + {y} = ")) except ValueError: print("EEE") error+=1 else: if answer != z: print("EEE") error+=1 else: correct+=1 print(f"\nScore: Correct = {correct} Error = {error} ") def get_level(): while True: try: level=int(input("Level: ")) except ValueError: pass else: if level in range(1,4): return level def generate_integer(level): dic={1:101,2:10,3:1} return randint(100//dic[level],999//dic[level]),randint(100//dic[level],999//dic[level]) if __name__=="__main__": main()
|
|
« Última modificación: 11 Junio 2022, 05:44 am por reymosquito »
|
En línea
|
|
|
|
juanfelr
Desconectado
Mensajes: 67
|
Hola, perdón pero es muy feo el código, igual el problema es que estás manejando excepciones y no le decís que haga algo sino que las pase con: i+=1 correct+=1 except ValueError: print("EEE")
solucionarías ese detalle Dicho sea de paso hay una sección de scripts edito: te muestro otra forma de escribir ese código, no es la mejor pero simplifica bastante: #-*- coding:utf-8 -*- from random import randint def main(): level=get_level() correct=0 error = 0 for x in range(10): x, y = generate_integer(level) z = x + y try: answer=int(input(f"{x} + {y} = ")) except ValueError: print("EEE") error+=1 else: if answer != z: print("EEE") error+=1 else: correct+=1 print(f"\nScore: Correct = {correct} Error = {error} ") def get_level(): while True: try: level=int(input("Level: ")) except ValueError: pass else: if level in range(1,4): return level def generate_integer(level): dic={1:101,2:10,3:1} return randint(100//dic[level],999//dic[level]),randint(100//dic[level],999//dic[level]) if __name__=="__main__": main()
Saludos reymosquito, tienes toda la razón, aún tengo un largo camino or recorrer y pulir la estetica del codigo hace parte del aprendizaje. Mil gracias por tu sugerencia, la pondré en práctica y estare comentando los resultados.
|
|
|
En línea
|
|
|
|
juanfelr
Desconectado
Mensajes: 67
|
Hola, perdón pero es muy feo el código, igual el problema es que estás manejando excepciones y no le decís que haga algo sino que las pase con: i+=1 correct+=1 except ValueError: print("EEE")
solucionarías ese detalle Dicho sea de paso hay una sección de scripts edito: te muestro otra forma de escribir ese código, no es la mejor pero simplifica bastante: #-*- coding:utf-8 -*- from random import randint def main(): level=get_level() correct=0 error = 0 for x in range(10): x, y = generate_integer(level) z = x + y try: answer=int(input(f"{x} + {y} = ")) except ValueError: print("EEE") error+=1 else: if answer != z: print("EEE") error+=1 else: correct+=1 print(f"\nScore: Correct = {correct} Error = {error} ") def get_level(): while True: try: level=int(input("Level: ")) except ValueError: pass else: if level in range(1,4): return level def generate_integer(level): dic={1:101,2:10,3:1} return randint(100//dic[level],999//dic[level]),randint(100//dic[level],999//dic[level]) if __name__=="__main__": main()
Saludos reymosquito, me ha servido bastante tu sugerencia (tanto en orden como en solucion) sin embargo lo siguiente introduce más dificultad al código y no he logrado resolverlo. El problema consiste en lo siguiente: - El algoritmo debe permitir dos oportunidades más de responder correctamente el problema antes de registrar error. Para tal caso debe mostrar nuevamente el mismo problema, pero no sé como hacer eso. Intenté copiar la linea answer=int(input(f"{x} + {y} = ")) pero aunque parece funcionar bien, otras veces genera errores. Si de pronto sabes como indicarle dentro de la excepción o dentro del condicional que me repita la misma pregunta otras dos veces antes de contar error y saltar a la siguiente pregunta, te estare muy agradecido. Llevo como dos semanas intentando varias opciones pero sin resultado. Muchas gracias
|
|
|
En línea
|
|
|
|
reymosquito
Desconectado
Mensajes: 81
|
es básicamente lo mismo agregando un contador y un bucle más los condicionales, veo que estás aprendiendo, pero esto es lo más simple de python, no debería costarte si quieres seguir avanzando. #-*- coding:utf-8 -*- from random import randint def main(): level=get_level() correct=0 error = 0 conteo = 0 for x in range(10): x, y = generate_integer(level) z = x + y while True: try: answer=int(input(f"{x} + {y} = ")) except ValueError: conteo+=1 print("EEE") if conteo == 2: error+= 1 conteo = 0 break else: if answer != z: conteo+=1 print("EEE") if conteo == 2: error+= 1 conteo = 0 break else: correct+=1 break print(f"\nScore: Correct = {correct} Error = {error} ") def get_level(): while True: try: level=int(input("Level: ")) except ValueError: pass else: if level in range(1,4): return level def generate_integer(level): dic={1:101,2:10,3:1} return randint(100//dic[level],999//dic[level]),randint(100//dic[level],999//dic[level]) if __name__=="__main__": main()
Supongo que eso es lo que buscás.
|
|
|
En línea
|
|
|
|
juanfelr
Desconectado
Mensajes: 67
|
Estaba completamente perdido, jamás se me habria ocurrido usar el ciclo for y después while antes de la sentencia try, Mil gracias reymosquito, era exactamente lo que necesitaba, espero superar mas fácilmente las siguientes tareas y mejorar el nivel. es básicamente lo mismo agregando un contador y un bucle más los condicionales, veo que estás aprendiendo, pero esto es lo más simple de python, no debería costarte si quieres seguir avanzando. #-*- coding:utf-8 -*- from random import randint def main(): level=get_level() correct=0 error = 0 conteo = 0 for x in range(10): x, y = generate_integer(level) z = x + y while True: try: answer=int(input(f"{x} + {y} = ")) except ValueError: conteo+=1 print("EEE") if conteo == 2: error+= 1 conteo = 0 break else: if answer != z: conteo+=1 print("EEE") if conteo == 2: error+= 1 conteo = 0 break else: correct+=1 break print(f"\nScore: Correct = {correct} Error = {error} ") def get_level(): while True: try: level=int(input("Level: ")) except ValueError: pass else: if level in range(1,4): return level def generate_integer(level): dic={1:101,2:10,3:1} return randint(100//dic[level],999//dic[level]),randint(100//dic[level],999//dic[level]) if __name__=="__main__": main()
Supongo que eso es lo que buscás. Feliz noche.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Python] ¿Por qué Python 2.7.3 admite la sintaxis de Python 3?
« 1 2 »
Python
|
Yidu
|
10
|
12,346
|
10 Febrero 2013, 21:46 pm
por Eleкtro
|
|
|
[Python/Tkinter](Kyurem v2.0)Consola de comandos hecha en python
Python
|
AdeLax
|
0
|
4,865
|
9 Agosto 2013, 22:45 pm
por AdeLax
|
|
|
[Python/Tkinter](Kyurem v2.0)Consola de comandos hecha en python (Continuación)
Python
|
Príncipe_Azul
|
5
|
5,759
|
16 Abril 2014, 11:19 am
por AdeLax
|
|
|
[AYUDA][PYTHON] Leer y guardar archivos .exe de forma hexadecimal en python???
Scripting
|
Noxware
|
3
|
6,041
|
22 Agosto 2014, 09:33 am
por Eleкtro
|
|
|
[Solucionado][PYTHON]Como dibujar un triangulo perfecto en python con TKinter?
Programación General
|
Mastodonte
|
2
|
7,344
|
24 Septiembre 2017, 15:50 pm
por Mastodonte
|
|