diff --git a/exercises/exercise1.py b/exercises/exercise1.py index 4d88ccc..409f26d 100644 --- a/exercises/exercise1.py +++ b/exercises/exercise1.py @@ -2,13 +2,20 @@ from math import pi - class Circle: + + def __init__(self, radio: float) -> None: + self.radio = radio + + def area(self) -> float: + return round((pi * (self.radio ** 2)), 2) + + def perimetro(self) -> float: + return round((2 * pi * self.radio), 2) + """Todo cículo tiene un radio y se desea conocer tanto el área como el perímetro (longitud de circunferencia). - Reportar los números redondeados a dos decimales - Restricciones: - Utilizar 1 variable de instancia - Utilizar 2 métodos de instancia @@ -42,4 +49,4 @@ class Circle: # Test invocación encadenada assert Circle(1).area() == 3.14 assert Circle(1).perimetro() == 6.28 -# NO MODIFICAR - FIN +# NO MODIFICAR - FIN \ No newline at end of file diff --git a/exercises/exercise2.py b/exercises/exercise2.py index 2b02c90..0c3519d 100644 --- a/exercises/exercise2.py +++ b/exercises/exercise2.py @@ -1,16 +1,30 @@ """Variables de Clase y Métodos de Clase.""" - class Article: + iva: float = 0.21 + + def __init__(self, nombre: str, costo: float, descuento: float = None) -> None: + self.nombre = nombre + self.costo = costo + self.descuento = descuento + + + def calcular_precio(self) -> float: + precio = (self.costo + (self.costo * self.iva)) + if self.descuento != None: + return round(precio - (precio * self.descuento), 2) + return round(precio, 2) + + @classmethod + def actualizar_iva(cls, iva: float) -> None: + cls.iva = iva + """Todos los artículos tienen un nombre y un costo, opcionalmente algunos tienen un porcentaje de descuento. - El IVA es un impuesto que se aplica a todos los productos por igual, actualmente es de 21% pero puede cambiar en el futuro. - Para calcular el precio de un artículo, hay que sumar el IVA y luego restar los descuentos si hubiera. Redondear a 2 decimales. - Restricciones: - Utilizar 3 variables de instancia - Utilizar 1 método de instancia @@ -68,4 +82,4 @@ class Article: article = Article(costo=1, nombre="Auto") assert article.nombre == "Auto" assert article.calcular_precio() == 1.25 -# NO MODIFICAR - FIN +# NO MODIFICAR - FIN \ No newline at end of file diff --git a/exercises/exercise3.py b/exercises/exercise3.py index 331440a..8924fdc 100644 --- a/exercises/exercise3.py +++ b/exercises/exercise3.py @@ -2,9 +2,28 @@ class Article: + iva: float = 0.21 + + def __init__(self, nombre: str, costo: float, descuento: float = None) -> None: + self.nombre = nombre + self.costo = costo + self.descuento = descuento + self.precio + + # Proporty me sirve para definir un atributo calculado. + @property + def precio(self) -> float: + precio = (self.costo + (self.costo * self.iva)) + if self.descuento != None: + return round(precio - (precio * self.descuento), 2) + return round(precio, 2) + + @classmethod + def actualizar_iva(cls, iva: float) -> None: + cls.iva = iva + """Re-Escribir el ejercicio anterior utilizando una property en vez de un método de instancia. - Restricciones: - Utilizar 3 variables de instancia - Utilizar 1 property @@ -71,4 +90,4 @@ class Article: article = Article(costo=1, nombre="Auto") assert article.nombre == "Auto" assert article.precio == 1.25 -# NO MODIFICAR - FIN +# NO MODIFICAR - FIN \ No newline at end of file diff --git a/exercises/exercise4.py b/exercises/exercise4.py index b424db7..b3d17e0 100644 --- a/exercises/exercise4.py +++ b/exercises/exercise4.py @@ -1,16 +1,30 @@ """DataClasses y Sobrecarga de operadores.""" +from __future__ import annotations from dataclasses import dataclass from typing import List +@dataclass +class Materia: + nombre: str + +@dataclass +class Carrera: + materias: List[Materia] + + def __len__(self) -> int: + return len(self.materias) + + # longitud: list + + # def __str__(self) -> str: + # return f"Carrera(materias={self.longitud})" + """Una carrera tiene varias materias, la "longitud" de una carrera hace referencia a cuantas materias tiene. - Cada materia tiene un nombre. - Escribir una estructura de clases que refleje lo anterior. - Restricciones: - Utilizar Dataclasses - Utilizar 2 clases @@ -52,4 +66,4 @@ ) assert len(ciclo_basico) == 2 -# NO MODIFICAR - FIN +# NO MODIFICAR - FIN \ No newline at end of file diff --git a/exercises/exercise5.py b/exercises/exercise5.py index 92d717c..57188f4 100644 --- a/exercises/exercise5.py +++ b/exercises/exercise5.py @@ -2,25 +2,19 @@ laboralmente Contribuyentes, sin embargo, existen varios tipos de contribuyentes, por ejemplo, el Monotributista y el que es Empleado en relación de dependencia. Ambos están dentro del sistema pero pagan diferentes impuestos. - El monotributista tiene que pagar en función de sus ingresos brutos anuales: - Si son menores a $370.000, paga $2646,22 mensuales - Si son menores a $550.000, paga $2958,95 mensuales - Si son menores a $770.000, paga $3382,62 mensuales - Si son mayores a $770.000, paga $3988,85 mensuales - En el caso de los empleados en relación de dependencia, ellos pagan un 17% de impuestos sobre sus ingresos brutos mensuales. - Inspirado en datos reales: https://www.afip.gob.ar/monotributo/categorias.asp - Escribir una estructura de clases que refleje lo anterior. Para simplificar el análisis, todos los montos serán mensuales (dividir los límites del monotributo por 12). - Aclaración: Este ejercicio está basado en la realidad pero se realizaron múltiples simplificaciones para adecuarlo al contexto del curso. - Restricciones: - Utilizar Dataclasses - Utilizar 3 clases: 1 abstracta y 2 concretas @@ -37,10 +31,48 @@ from dataclasses import dataclass from typing import List +# Clase abstracta Contribuyente con método calcular_sueldo() +# Clases concretas: Monotributista Empleado +## variable de instancia ingreso +## redefino calcular_sueldo() + +@dataclass +class Contribuyente(ABC): + + @abstractmethod + def calcular_sueldo() -> float: + pass + +@dataclass +class Monotributista(Contribuyente): + monto: float + + def calcular_sueldo(self) -> float: + if(self.monto < (370000/12)): + return self.monto - 2646.22 + elif(self.monto < (550000/12)): + return self.monto - 2958.95 + elif(self.monto < (770000/12)): + return self.monto - 3382.62 + elif(self.monto > (770000/12)): + return self.monto - 3988.85 + + +@dataclass +class Empleado(Contribuyente): + monto: float + + def calcular_sueldo(self)-> float: + return self.monto - (self.monto * 0.17) + def calcular_sueldos(contribuyentes: List[Contribuyente]): """Data una lista de contribuyentes, devuelve una lista de los sueldos de cada uno.""" + sueldos=[] + for i in contribuyentes: + sueldos.append(i.calcular_sueldo()) + return sueldos # NO MODIFICAR - INICIO @@ -97,7 +129,7 @@ def calcular_sueldos(contribuyentes: List[Contribuyente]): # Test Calculadora de sueldos contribuyentes = [Monotributista(80_000), Empleado(80_000)] - +# print(calcular_sueldos(contribuyentes)) assert calcular_sueldos(contribuyentes) == [76011.15, 66400.0] -# NO MODIFICAR - FIN +# NO MODIFICAR - FIN \ No newline at end of file