Validar ingreso de datos con Python

Iniciado por NOB2014, 16 Octubre 2017, 19:14 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

Hola amigos, ¿como están?.
Tengo una duda con el código que dejo a continuación, con estos videos estoy aprendiendo a programar en python:https://www.youtube.com/watch?v=2MaAs7XU2T0 y he llegado a las excepciones, la consulta es como resulta más conveniente validar los datos ingresado por teclado, utilizando try/except o con if, para validar un dato float no se debe permitir el ingreso de otra cosa que no sean números del 0 al 9 y que las variables op1 y op2 no pueden valer cero, creo que es todo -
Otra cosita, me podrían dar alguna idea para mejorar el código. -

Código (python) [Seleccionar]
import os

def sum(num1, num2):
return num1+num2

def res(num1, num2):
return num1-num2

def div(num1, num2):
return num1/num2

def mul(num1, num2):
return num1*num2

while True:
op1=(float(input("\n Introduce el primer número...: ")))
op2=(float(input("\n Introduce el segundo numero..: ")))

print("\n ====================================")
print("\n 1 - Suma\n 2 - Resta\n 3 - División\n 4 - Multiplicación\n ")
operacion=(int(input("\n Introduce opción..: ")))

if operacion == 1:
print("\n " + str(op1) + " + " + str(op2) + " = ",  sum(op1,op2))
if operacion == 2:
print("\n " + str(op1) + " - " + str(op2) + " = ",  res(op1,op2))
if operacion == 3:
print("\n " + str(op1) + " / " + str(op2) + " = ",  div(op1,op2))
if operacion == 4:
print("\n " + str(op1) + " x " + str(op2) + " = ",  mul(op1,op2))

print("\n ====================================")
print("\n 1 - Otra operación\n 2 - Finalizar\n ")
salSeg=(int(input("\n Introduce opción..: ")))

if salSeg == 1:
os.system('clear')
else:
break



Desde ya muchas gracias.-
Un abrazo. Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

engel lex

yo recomiendo if, ya que try-except te puede sopbrecomplicar una tarea simple
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

n1sen

Cita de: NOB2014 en 16 Octubre 2017, 19:14 PM


Código (python) [Seleccionar]
i
if operacion == 1:
print("\n " + str(op1) + " + " + str(op2) + " = ",  sum(op1,op2))
if operacion == 2:
print("\n " + str(op1) + " - " + str(op2) + " = ",  res(op1,op2))
if operacion == 3:
print("\n " + str(op1) + " / " + str(op2) + " = ",  div(op1,op2))
if operacion == 4:
print("\n " + str(op1) + " x " + str(op2) + " = ",  mul(op1,op2))

print("\n ====================================")
print("\n 1 - Otra operación\n 2 - Finalizar\n ")
salSeg=(int(input("\n Introduce opción..: ")))

if salSeg == 1:
os.system('clear')
else:
break


Si quieres hacer una especie de menú, no pongas como lo hiciste, ponlo así:
Código (python) [Seleccionar]

if operacion == 1:
    # tu codigo aca
elif operacion == 2:
    # tu codigo aca

etc...
null

NOB2014

Hola n1sen me quedó una duda con tu sugerencia, debo suponer que ¿si pongo todos if el programa leerá las 4 instrucciones aunque la primera de verdadero? y si pongo if/elif ¿ocurrirá lo contrario?.-
Por último dejo unas cuantas lineas de código que hace lo que pretendía y parece no tener fallas.-

Código (python) [Seleccionar]
numeros = puntos = otros = 0
convertido = 0.0

operando = input("\n Introduzca operando (No puede ser cero)...:")

for i in operando:
if i.isdigit() and i != '0':
numeros +=1
elif i == '.':
puntos +=1
elif i != '0':
otros +=1

if numeros == 0 or puntos > 1 or otros > 0:
print("\n No se puede convertir " , operando + " a float")
else:
convertido = float(operando)
print("\n Operando convertido...: %.3f" % convertido)

Un abrazo.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

engel lex

2 formas para validar, una con if y otra con try

para la primera forma (if) es bueno saber que formatos acepta float como validos, estos son
1
1.0
1. -> 1.0
.1 -> 0.1


Código (python) [Seleccionar]
def input_float(text):
  value = input(text)
  import re #para usar regex
  if re.match("^\d*?(\.\d*)?$", value):
    return float(value)
  return False


ciertamente reviso y try catch en este caso no es tan mala opción (si se pone como una función independiente

Código (python) [Seleccionar]

def input_float(text):
  try:
    return float(input(text))
  except ValueError:
    return False

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

tincopasan

lo primero que te aclaro es que python permite trabajar de distintas formas y salvo algunas excepciones no hay una mejor que otra, lo que si se sabe decir es que un script es a la vieja escuela o la nueva.
usando básicamente tu código lo modifique para que veas otra forma:

Código (python) [Seleccionar]

#-*-coding: utf -8 -*-         
import os,sys
class Calculadora:
    def __init__(self):
        self.elecciones= {
            "1":self.sum,
            "2":self.res,
            "3":self.div,
            "4":self.mul,
            "5":self.salir,
             }
           
    def menu(self):
        print("=" * 25) #así sé con exactitud cuantos caracteres quiero imprimir
        print(" 1 - Suma\n 2 - Resta\n 3 - División\n 4 - Multiplicación\n 5 - Salir\n ")
           
    def ejecutar(self):
        while True:
            self.menu()
            eleccion= input("elige una opción: ")
            accion = self.elecciones.get(eleccion)
            if accion:
                accion()
            else:
                print("{} no es una elección válida".format(eleccion))
               
    def validar(self):
        global num1,num2
        con1=True
        while con1:
            try:
                num1= float(input("Ingrese el primer número: "))
                con1= False
            except ValueError:
                print("El primer valor deber ser un número")
        con2=True
        while con2:
            try:
                num2= float(input("Ingrese el segundo número: "))
                con2= False
            except ValueError:
                print("El segundo valor deber ser un número")   
           
    def sum(self):
        print("Eligió SUMAR")
        self.validar()
        res=num1+num2
        print("{} + {} = {}".format(num1,num2,res))
           
    def res(self):
        print("Eligió RESTAR")
        self.validar()
        res=num1 - num2
        print("{} - {} = {}".format(num1,num2,res))       
       

    def div(self):
        print("Eligió DIVIDIR")
        self.validar()
        if num1 == 0 or num2 == 0 :
            print("No se puede divividr por 0")
        else:   
            res=num1 / num2
            print("{} / {} = {}".format(num1,num2,res))       
       

    def mul(self):
        print("Eligió MULTIPLICAR")
        self.validar()
        res=num1 * num2
        print("{} * {} = {}".format(num1,num2,res))       

    def salir(self):        # ya que estás usando os agrego sys
        os.system("cls")
        msg=" Programa terminado "
        print(msg.center(28,"*"))
        os.system("pause")
        sys.exit(0)     

calc=Calculadora()
calc.ejecutar()

me parece muy bien que uses distintas funciones para cada cosa(agregué algunas), como dicen es mejor dividir un problema en partes más pequeñas.
En cuanto a tantos if o elif no es que no se pueda o deba usarlos, pero para eso están los diccionarios, que vienen a ser como los select o switch de otros lenguajes(por si programas en alguno de ellos).
Después como ya te dijo engel lex podés usar para verificaciones distintas formas dependiendo de lo que busques, para algo más complejo sin lugar a dudas usar re, en este caso es simple así que no es tan necesario.
Saludos.


NOB2014

Hola engel lex, tengo 2 dudas con respecto a tú código, la primer es con expresiones regulares que no tengo ni idea como funcionan pero eso es para más adelante, lo que quisiera saber es si es estrictamente necearía esta línea de código porque me da error y si la saco el programa funciona perfectamente. -

Código (python) [Seleccionar]
value = input(text)

Código (python) [Seleccionar]
def input_float(text):
import re #para usar regex
if re.match("^\d*?(\.\d*)?$", text):
return float(text)
return False

texto = input("\n Ingrese un número (puede ser con decimales...:) ")

a = (input_float(texto))

if a == 0:
print("\n No se puede convertir ", str(texto) + " a float")
else:
print("\n", str(a))


Saludos y gracias.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-