elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ValueError en Python
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ValueError en Python  (Leído 1,041 veces)
juanfelr

Desconectado Desconectado

Mensajes: 62


Ver Perfil
ValueError en Python
« en: 11 Junio 2022, 02:46 am »

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.

Código:
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 Desconectado

Mensajes: 10


Ver Perfil
Re: ValueError en Python
« Respuesta #1 en: 11 Junio 2022, 04:27 am »

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:

          
Código
  1.  
  2.            i+=1
  3.            correct+=1
  4.        except ValueError:
  5.            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:

Código
  1. #-*- coding:utf-8 -*-
  2. from random import randint
  3.  
  4. def main():
  5.    level=get_level()    
  6.    correct=0
  7.    error = 0
  8.    for x in range(10):
  9.        x, y = generate_integer(level)
  10.        z = x + y
  11.        try:
  12.            answer=int(input(f"{x} + {y} = "))        
  13.        except ValueError:
  14.            print("EEE")
  15.            error+=1
  16.        else:
  17.            if answer != z:
  18.                print("EEE")
  19.                error+=1
  20.            else:
  21.                correct+=1
  22.    print(f"\nScore: Correct = {correct} Error = {error} ")
  23.  
  24. def get_level():
  25.    while True:
  26.        try:
  27.            level=int(input("Level: "))
  28.        except ValueError:
  29.            pass
  30.        else:
  31.            if level in range(1,4):
  32.                return level
  33.  
  34. def generate_integer(level):
  35.    dic={1:101,2:10,3:1}
  36.    return randint(100//dic[level],999//dic[level]),randint(100//dic[level],999//dic[level])
  37.  
  38. if __name__=="__main__":
  39.    main()
  40.  


« Última modificación: 11 Junio 2022, 05:44 am por reymosquito » En línea

juanfelr

Desconectado Desconectado

Mensajes: 62


Ver Perfil
Re: ValueError en Python
« Respuesta #2 en: 12 Junio 2022, 21:08 pm »

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:

          
Código
  1.  
  2.            i+=1
  3.            correct+=1
  4.        except ValueError:
  5.            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:

Código
  1. #-*- coding:utf-8 -*-
  2. from random import randint
  3.  
  4. def main():
  5.    level=get_level()    
  6.    correct=0
  7.    error = 0
  8.    for x in range(10):
  9.        x, y = generate_integer(level)
  10.        z = x + y
  11.        try:
  12.            answer=int(input(f"{x} + {y} = "))        
  13.        except ValueError:
  14.            print("EEE")
  15.            error+=1
  16.        else:
  17.            if answer != z:
  18.                print("EEE")
  19.                error+=1
  20.            else:
  21.                correct+=1
  22.    print(f"\nScore: Correct = {correct} Error = {error} ")
  23.  
  24. def get_level():
  25.    while True:
  26.        try:
  27.            level=int(input("Level: "))
  28.        except ValueError:
  29.            pass
  30.        else:
  31.            if level in range(1,4):
  32.                return level
  33.  
  34. def generate_integer(level):
  35.    dic={1:101,2:10,3:1}
  36.    return randint(100//dic[level],999//dic[level]),randint(100//dic[level],999//dic[level])
  37.  
  38. if __name__=="__main__":
  39.    main()
  40.  

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 Desconectado

Mensajes: 62


Ver Perfil
Re: ValueError en Python
« Respuesta #3 en: 23 Junio 2022, 03:41 am »

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:

          
Código
  1.  
  2.            i+=1
  3.            correct+=1
  4.        except ValueError:
  5.            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:

Código
  1. #-*- coding:utf-8 -*-
  2. from random import randint
  3.  
  4. def main():
  5.    level=get_level()    
  6.    correct=0
  7.    error = 0
  8.    for x in range(10):
  9.        x, y = generate_integer(level)
  10.        z = x + y
  11.        try:
  12.            answer=int(input(f"{x} + {y} = "))        
  13.        except ValueError:
  14.            print("EEE")
  15.            error+=1
  16.        else:
  17.            if answer != z:
  18.                print("EEE")
  19.                error+=1
  20.            else:
  21.                correct+=1
  22.    print(f"\nScore: Correct = {correct} Error = {error} ")
  23.  
  24. def get_level():
  25.    while True:
  26.        try:
  27.            level=int(input("Level: "))
  28.        except ValueError:
  29.            pass
  30.        else:
  31.            if level in range(1,4):
  32.                return level
  33.  
  34. def generate_integer(level):
  35.    dic={1:101,2:10,3:1}
  36.    return randint(100//dic[level],999//dic[level]),randint(100//dic[level],999//dic[level])
  37.  
  38. if __name__=="__main__":
  39.    main()
  40.  

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
Código:
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 Desconectado

Mensajes: 10


Ver Perfil
Re: ValueError en Python
« Respuesta #4 en: 23 Junio 2022, 08:07 am »

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.
Código
  1. #-*- coding:utf-8 -*-
  2. from random import randint
  3.  
  4. def main():
  5.    level=get_level()    
  6.    correct=0
  7.    error = 0
  8.    conteo = 0
  9.    for x in range(10):
  10.        x, y = generate_integer(level)
  11.        z = x + y
  12.        while True:
  13.            try:
  14.                answer=int(input(f"{x} + {y} = "))        
  15.            except ValueError:
  16.                conteo+=1
  17.                print("EEE")
  18.                if conteo == 2:
  19.                    error+= 1
  20.                    conteo = 0
  21.                    break
  22.            else:
  23.                if answer != z:
  24.                    conteo+=1
  25.                    print("EEE")
  26.                    if conteo == 2:
  27.                        error+= 1
  28.                        conteo = 0
  29.                        break                    
  30.                else:
  31.                    correct+=1
  32.                    break
  33.    print(f"\nScore: Correct = {correct} Error = {error} ")
  34.  
  35. def get_level():
  36.    while True:
  37.        try:
  38.            level=int(input("Level: "))
  39.        except ValueError:
  40.            pass
  41.        else:
  42.            if level in range(1,4):
  43.                return level
  44.  
  45. def generate_integer(level):
  46.    dic={1:101,2:10,3:1}
  47.    return randint(100//dic[level],999//dic[level]),randint(100//dic[level],999//dic[level])
  48.  
  49. if __name__=="__main__":
  50.    main()
  51.  
  52.  

Supongo que eso es lo que buscás.
En línea

juanfelr

Desconectado Desconectado

Mensajes: 62


Ver Perfil
Re: ValueError en Python
« Respuesta #5 en: 24 Junio 2022, 03:47 am »

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.
Código
  1. #-*- coding:utf-8 -*-
  2. from random import randint
  3.  
  4. def main():
  5.    level=get_level()    
  6.    correct=0
  7.    error = 0
  8.    conteo = 0
  9.    for x in range(10):
  10.        x, y = generate_integer(level)
  11.        z = x + y
  12.        while True:
  13.            try:
  14.                answer=int(input(f"{x} + {y} = "))        
  15.            except ValueError:
  16.                conteo+=1
  17.                print("EEE")
  18.                if conteo == 2:
  19.                    error+= 1
  20.                    conteo = 0
  21.                    break
  22.            else:
  23.                if answer != z:
  24.                    conteo+=1
  25.                    print("EEE")
  26.                    if conteo == 2:
  27.                        error+= 1
  28.                        conteo = 0
  29.                        break                    
  30.                else:
  31.                    correct+=1
  32.                    break
  33.    print(f"\nScore: Correct = {correct} Error = {error} ")
  34.  
  35. def get_level():
  36.    while True:
  37.        try:
  38.            level=int(input("Level: "))
  39.        except ValueError:
  40.            pass
  41.        else:
  42.            if level in range(1,4):
  43.                return level
  44.  
  45. def generate_integer(level):
  46.    dic={1:101,2:10,3:1}
  47.    return randint(100//dic[level],999//dic[level]),randint(100//dic[level],999//dic[level])
  48.  
  49. if __name__=="__main__":
  50.    main()
  51.  
  52.  

Supongo que eso es lo que buscás.

Feliz noche.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines