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
14 changes: 9 additions & 5 deletions exercises/exercise1.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@
class Circle:
"""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 All @@ -17,8 +15,14 @@ class Circle:
- No utilizar Properties
- Utilizar Type Hints en todos los métodos y variables
"""


def __init__(self,radio):
self.radio = radio

def area(self):
return round(pi * self.radio ** 2, 2)

def perimetro(self):
return round(2 * self.radio * pi, 2)
# NO MODIFICAR - INICIO
# Test básico
circle = Circle(1)
Expand All @@ -42,4 +46,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
23 changes: 19 additions & 4 deletions exercises/exercise2.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,10 @@
class Article:
"""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 All @@ -21,6 +18,22 @@ class Article:
- Utilizar Type Hints en todos los métodos y variables
"""

__iva=0.21

def __init__(self, nombre, costo, descuento=0):
self.nombre = nombre
self.costo = costo
self.descuento = descuento


def calcular_precio(self):
precio = round(self.costo + (self.costo * self.__iva), 2)
precio_final = round(precio - (self.descuento * precio), 2)
return precio_final

@classmethod
def actualizar_iva(cls,iva):
cls.__iva=iva

# NO MODIFICAR - INICIO
# Test parámetro obligatorio
Expand Down Expand Up @@ -49,9 +62,11 @@ class Article:

article = Article("Auto", 1, 0.21)
assert article.nombre == "Auto"
print(article.calcular_precio())
assert article.calcular_precio() == 0.96



# Test palabra clave
article = Article(costo=1, nombre="Auto")
assert article.nombre == "Auto"
Expand All @@ -68,4 +83,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
26 changes: 23 additions & 3 deletions exercises/exercise3.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
class Article:
"""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 All @@ -14,7 +13,28 @@ class Article:
- No utilizar Dataclasses
- Utilizar Type Hints en todos los métodos y variables
"""

__IVA = 0.21

def __init__(self, nombre, costo, descuento = 0):
self.nombre = nombre
self.costo = costo
self.descuento = descuento

@property
def precio(self):
precio = round (self.costo + (self.costo * self.__IVA),2)
precio_final = round (precio - (self.descuento * precio),2)
return precio_final

def calcular_precio (self):
precio_iva = round((self.costo * self.__IVA) + self.costo,2)
precio = round((precio_iva - precio_iva * self.descuento),2)
return precio

@classmethod
def actualizar_iva(cls, iva_nuevo):
cls.__IVA = iva_nuevo
return cls.__IVA

# NO MODIFICAR - INICIO
# Test parámetro obligatorio
Expand Down Expand Up @@ -71,4 +91,4 @@ class Article:
article = Article(costo=1, nombre="Auto")
assert article.nombre == "Auto"
assert article.precio == 1.25
# NO MODIFICAR - FIN
# NO MODIFICAR - FIN
18 changes: 14 additions & 4 deletions exercises/exercise4.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,8 @@

"""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 All @@ -22,6 +19,19 @@
- No utilizar properties
- Utilizar Type Hints en todos los métodos y variables
"""
@dataclass
class Materia:
nombre:str

@dataclass
class Carrera:
longitud:str

def __str__(self):
return f"Carrera(materias=(self.longitud))"

def __len__(self):
return len(self.longitud)


# NO MODIFICAR - INICIO
Expand Down Expand Up @@ -52,4 +62,4 @@
)

assert len(ciclo_basico) == 2
# NO MODIFICAR - FIN
# NO MODIFICAR - FIN
44 changes: 37 additions & 7 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 @@ -35,12 +29,48 @@
import abc
from abc import ABC, abstractmethod
from dataclasses import dataclass
from decimal import Rounded
from typing import List


class Contribuyente(ABC):
@abstractmethod
def calcular_sueldo(self):
pass

@dataclass
class Empleado(Contribuyente):
sueldo:int

def calcular_sueldo(self):
return self.sueldo*0.83

@dataclass
class Monotributista(Contribuyente):
sueldo:float

def calcular_sueldo(self):
sueldo_bruto = self.sueldo*12

if sueldo_bruto<370000:
sueldo_mensual_final=self.sueldo-2646.22
elif sueldo_bruto<550000:
sueldo_mensual_final=self.sueldo-2958.95
elif sueldo_bruto<770000:
sueldo_mensual_final=self.sueldo-3382.62
elif sueldo_bruto>770000:
sueldo_mensual_final=self.sueldo-3988.85
return sueldo_mensual_final



def calcular_sueldos(contribuyentes: List[Contribuyente]):
"""Data una lista de contribuyentes, devuelve una lista de los sueldos de
cada uno."""
sueldos_vacios=[]
for i in contribuyentes:
sueldos_vacios.append(i.calcular_sueldo())
return sueldos_vacios


# NO MODIFICAR - INICIO
Expand Down Expand Up @@ -100,4 +130,4 @@ def calcular_sueldos(contribuyentes: List[Contribuyente]):

assert calcular_sueldos(contribuyentes) == [76011.15, 66400.0]

# NO MODIFICAR - FIN
# NO MODIFICAR - FIN