Skip to content

Commit 7e276b4

Browse files
authored
Merge pull request mouredev#5877 from fborjalv/fborjalv-branch
#21 - Python
2 parents e825e76 + 747df82 commit 7e276b4

File tree

5 files changed

+411
-0
lines changed

5 files changed

+411
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import time
2+
import random
3+
import threading
4+
5+
"""
6+
/*
7+
* EJERCICIO:
8+
* Explora el concepto de callback en tu lenguaje creando un ejemplo
9+
* simple (a tu elección) que muestre su funcionamiento.
10+
"""
11+
def saludar(name):
12+
print(f"¿Cómo estás? {name}")
13+
14+
def ejecutar_callback(name, callback):
15+
print("Este saludo es está ejecutando desde una callback: ")
16+
callback(name)
17+
18+
saludar("Borja")
19+
20+
ejecutar_callback("Mouredev", saludar)
21+
22+
23+
"""
24+
* DIFICULTAD EXTRA (opcional):
25+
* Crea un simulador de pedidos de un restaurante utilizando callbacks.
26+
* Estará formado por una función que procesa pedidos.
27+
* Debe aceptar el nombre del plato, una callback de confirmación, una
28+
* de listo y otra de entrega.
29+
* - Debe imprimir un confirmación cuando empiece el procesamiento.
30+
* - Debe simular un tiempo aleatorio entre 1 a 10 segundos entre
31+
* procesos.
32+
* - Debe invocar a cada callback siguiendo un orden de procesado.
33+
* - Debe notificar que el plato está listo o ha sido entregado.
34+
*/
35+
36+
"""
37+
38+
39+
def order_process(dish, confirm, ready, delivering):
40+
def process():
41+
print(f"Hemos recibido su pedido que incluye {dish}")
42+
time.sleep(random.randint(1, 10))
43+
confirm(dish)
44+
ready(dish)
45+
delivering(dish)
46+
threading.Thread(target=process).start()
47+
48+
def confirm_callback(dish):
49+
print(f"Su pedido que incluye {dish} se está procesando")
50+
time.sleep(random.randint(1, 10))
51+
52+
def ready_callback(dish):
53+
print(f"Su pedido que incluye {dish} está listo. Se entregará en los próximos minutos")
54+
time.sleep(random.randint(1, 10))
55+
56+
def deliver_callback(dish):
57+
print(f"Su pedido que incluye {dish} ha sido entregado correctamente")
58+
59+
60+
order_process("gambas", confirm_callback, ready_callback, deliver_callback)
61+
order_process("ternera", confirm_callback, ready_callback, deliver_callback)
62+
order_process("mouse", confirm_callback, ready_callback, deliver_callback)
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
2+
from functools import reduce
3+
from datetime import date, datetime
4+
"""
5+
* EJERCICIO:
6+
* Explora el concepto de funciones de orden superior en tu lenguaje
7+
* creando ejemplos simples (a tu elección) que muestren su funcionamiento.
8+
9+
"""
10+
# Función como argumento
11+
12+
def saluda(name, saluda_callback):
13+
saluda_callback(name)
14+
15+
def texto(name):
16+
print(f"Hola {name}, como estás?")
17+
18+
saluda("Brais", texto)
19+
20+
# Función como retorno
21+
22+
def concatena_strings(name):
23+
def get_last_name(last_name):
24+
return name + " " + last_name
25+
return get_last_name
26+
name = concatena_strings("Borja") # devuelve función
27+
print(name("Lv")) #utlizamos función
28+
print(concatena_strings("Brais")("Moure")) # pasamos todos los argumentos
29+
30+
31+
# Sistema: map(), filter(), sorted(), reduce
32+
33+
my_list = ["Brais", "Borja", "María", "Sonia"]
34+
35+
36+
# map
37+
38+
def to_lower(name):
39+
return name.lower()
40+
41+
print(list(map(to_lower, my_list))) # aplica la función a todos los elementos de un iterable
42+
43+
44+
# filter:
45+
46+
def filter_by_name(name):
47+
return name[0] == "B"
48+
49+
print(list(filter(filter_by_name, my_list)))
50+
51+
52+
# sorted
53+
54+
print(sorted(my_list))
55+
print(sorted(my_list, reverse=True))
56+
print(sorted(my_list, key=lambda x: x))
57+
58+
# reduce
59+
60+
def reduce_one_line(x, y):
61+
return x + " " + y
62+
63+
print(reduce(reduce_one_line, my_list))
64+
65+
"""
66+
DIFICULTAD EXTRA (opcional):
67+
* Dada una lista de estudiantes (con sus nombres, fecha de nacimiento y
68+
* lista de calificaciones), utiliza funciones de orden superior para
69+
* realizar las siguientes operaciones de procesamiento y análisis:
70+
* - Promedio calificaciones: Obtiene una lista de estudiantes por nombre
71+
* y promedio de sus calificaciones.
72+
* - Mejores estudiantes: Obtiene una lista con el nombre de los estudiantes
73+
* que tienen calificaciones con un 9 o más de promedio.
74+
* - Nacimiento: Obtiene una lista de estudiantes ordenada desde el más joven.
75+
* - Mayor calificación: Obtiene la calificación más alta de entre todas las
76+
* de los alumnos.
77+
* - Una calificación debe estar comprendida entre 0 y 10 (admite decimales).
78+
79+
"""
80+
81+
student_list = [
82+
{"nombre": "Brais", "fecha_nacimiento": "29-04-1987", "calificaciones": [10, 3, 5, 8]},
83+
{"nombre": "Borja", "fecha_nacimiento": "29-04-1992", "calificaciones": [7, 6, 5, 9]},
84+
{"nombre": "Sonia", "fecha_nacimiento": "30-05-1999", "calificaciones": [2, 10, 10, 4]},
85+
{"nombre": "María", "fecha_nacimiento": "13-01-1985", "calificaciones": [4, 3, 4, 6]},
86+
]
87+
88+
def calcular_promedio_calificaciones(calificaciones):
89+
return(sum(calificaciones)/len(calificaciones))
90+
91+
92+
print("Promedio de calificaciones")
93+
print(list(map(lambda student: {"name": student["nombre"], "grades": calcular_promedio_calificaciones(student["calificaciones"])}, student_list)))
94+
95+
print("Mejores estudiantes")
96+
97+
print(
98+
list(
99+
map(lambda student:
100+
student["nombre"],
101+
filter(lambda student: calcular_promedio_calificaciones(student["calificaciones"]) >=5, student_list)
102+
)
103+
)
104+
)
105+
106+
print("Nacimientos")
107+
108+
def formatear_fechas(dates):
109+
return datetime.strptime(dates, "%d-%m-%Y").date()
110+
111+
print(list(map(lambda student:
112+
student["nombre"],
113+
sorted(student_list, key= lambda student: formatear_fechas(student["fecha_nacimiento"]), reverse=True)
114+
)))
115+
116+
print("Mayor calificación")
117+
118+
print(max(map(lambda student: max(student["calificaciones"]), student_list)))
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
2+
"""
3+
/*
4+
* EJERCICIO:
5+
* Explora el patrón de diseño "singleton" y muestra cómo crearlo
6+
* con un ejemplo genérico.
7+
*
8+
"""
9+
10+
class Singleton():
11+
12+
_instance = None
13+
14+
def __new__(cls):
15+
if not cls._instance:
16+
cls._instance = super(Singleton, cls).__new__(cls)
17+
return cls._instance
18+
19+
class SonSingleton(Singleton):
20+
pass
21+
22+
my_singleton1 = Singleton()
23+
my_singleton2 = Singleton()
24+
my_singleton3 = SonSingleton()
25+
print(my_singleton1)
26+
print(my_singleton2)
27+
print(my_singleton3)
28+
29+
"""
30+
31+
* DIFICULTAD EXTRA (opcional):
32+
* Utiliza el patrón de diseño "singleton" para representar una clase que
33+
* haga referencia a la sesión de usuario de una aplicación ficticia.
34+
* La sesión debe permitir asignar un usuario (id, username, nombre y email),
35+
* recuperar los datos del usuario y borrar los datos de la sesión.
36+
*/
37+
38+
"""
39+
40+
class UserSession:
41+
42+
id = None
43+
username = None
44+
nombre = None
45+
email = None
46+
_instance = None
47+
48+
def __new__(cls):
49+
if not cls._instance:
50+
cls._instance = super(UserSession, cls).__new__(cls)
51+
return cls._instance
52+
53+
def new_user(self, id, username, nombre, email):
54+
self.id = id
55+
self.username = username
56+
self.nombre = nombre
57+
self.email = email
58+
def show_data_user(self):
59+
print(f"{self.id , self.username, self.nombre, self.email}")
60+
61+
def clean_data(self):
62+
self.id = None
63+
self.username = None
64+
self.nombre = None
65+
self.email = None
66+
67+
68+
69+
70+
session1 = UserSession()
71+
session2 = UserSession()
72+
print(session1)
73+
print(session2)
74+
75+
session3 = UserSession()
76+
session3.new_user(1, "fborjalv", "Borja", "xxxxx@gmail.com")
77+
session3.show_data_user()
78+
session3.clean_data()
79+
80+
session4 = UserSession()
81+
session4.show_data_user()
82+
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
"""
2+
/*
3+
* EJERCICIO:
4+
* Explora el concepto de "decorador" y muestra cómo crearlo
5+
* con un ejemplo genérico.
6+
7+
"""
8+
9+
def decorator_operations(function):
10+
def show_name(*args):
11+
print(f"Estás utilizando la función {function.__name__}:")
12+
return function(*args)
13+
return show_name
14+
15+
16+
@decorator_operations
17+
def sumar(a, b):
18+
print(f"{a} + {b} = {a+b}")
19+
20+
def resta(a, b):
21+
print(f"{a} - {b} = {a-b}")
22+
23+
def multiplica(a, b):
24+
print(f"{a} x {b} = {a*b}")
25+
26+
sumar(2, 4)
27+
resta(2, 4)
28+
multiplica(2, 4)
29+
30+
"""
31+
*
32+
* DIFICULTAD EXTRA (opcional):
33+
* Crea un decorador que sea capaz de contabilizar cuántas veces
34+
* se ha llamado a una función y aplícalo a una función de tu elección.
35+
*/
36+
37+
"""
38+
39+
40+
def func_counter(function):
41+
42+
def counter(*args):
43+
counter.call_counter +=1
44+
print(f"La función {function.__name__} se ha ejecutado {counter.call_counter} veces")
45+
return function(*args)
46+
counter.call_counter = 0
47+
return counter
48+
49+
50+
@func_counter
51+
def saludo(name):
52+
print(f"Hola, {name} ¿Cómo estás?")
53+
54+
55+
for name in ["Brais", "Borja", "Sonia"]:
56+
saludo(name)

0 commit comments

Comments
 (0)