Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions exercises/exercise1.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
24 changes: 19 additions & 5 deletions exercises/exercise2.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
23 changes: 21 additions & 2 deletions exercises/exercise3.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
22 changes: 18 additions & 4 deletions exercises/exercise4.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -52,4 +66,4 @@
)

assert len(ciclo_basico) == 2
# NO MODIFICAR - FIN
# NO MODIFICAR - FIN
48 changes: 40 additions & 8 deletions exercises/exercise5.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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