Skip to content

Commit d76a710

Browse files
authored
Merge pull request mouredev#4236 from Aldroide/main
Modificación al ejercicio #21, ejercicios #22, #23 y #24
2 parents 07c8325 + eabd0b8 commit d76a710

File tree

4 files changed

+279
-26
lines changed

4 files changed

+279
-26
lines changed

Roadmap/21 - CALLBACKS/python/Aldroide.py

+25-26
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,19 @@
55

66
import random
77
import time
8+
import threading
89

910

10-
def saludar(nombre):
11-
print(f"Hola {nombre}")
11+
def saludar(nombre, callback):
12+
print("Ejecutando saludo...")
13+
callback(nombre)
1214

1315

14-
def EntradaUsuario(callback):
15-
nombre = input("Ingresa tu nombre: ")
16-
callback(nombre)
16+
def EntradaUsuario(nombre):
17+
print(f"Hola, {nombre}!")
1718

1819

19-
EntradaUsuario(saludar)
20+
saludar("aldo", EntradaUsuario)
2021

2122
"""DIFICULTAD EXTRA (opcional):
2223
Crea un simulador de pedidos de un restaurante utilizando callbacks.
@@ -30,36 +31,34 @@ def EntradaUsuario(callback):
3031

3132

3233
# Definir las funciones callback
33-
34-
def confirm(dish):
34+
def order_process(dish, confirm_callback, ready_callback, delivered_callback):
35+
def process():
36+
confirm_callback(dish)
37+
# Simula el tiempo de preparación
38+
prep_time = random.randint(1, 10)
39+
time.sleep(prep_time)
40+
ready_callback(dish)
41+
# Simula el tiempo de entrega
42+
delivery_time = random.randint(1, 10)
43+
time.sleep(delivery_time)
44+
delivered_callback(dish)
45+
threading.Thread(target=process).start()
46+
47+
48+
def confirm(dish: str):
3549
print(f"Pedido confirmado: {dish}")
3650

3751

38-
def ready(dish):
52+
def ready(dish: str):
3953
print(f"Plato listo: {dish}")
4054

4155

42-
def deliver(dish):
56+
def delivered(dish: str):
4357
print(f"Pedido entregado: {dish}")
4458

4559
# Función que procesa los pedidos
4660

4761

48-
def process(dish, confirm, ready, deliver):
49-
# Confirmar el pedido
50-
confirm(dish)
51-
52-
# Simula el tiempo de preparación
53-
prep_time = random.randint(1, 10)
54-
time.sleep(prep_time)
55-
ready(dish)
56-
57-
# Simula el tiempo de entrega
58-
delivery_time = random.randint(1, 10)
59-
time.sleep(delivery_time)
60-
deliver(dish)
61-
62-
6362
# Simular el procesamiento de un pedido
6463
dish = input("¿Que desea ordenar? ")
65-
process(dish, confirm, ready, deliver)
64+
order_process("Limon", confirm, ready, delivered)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
from functools import reduce
2+
from datetime import datetime
3+
4+
"""
5+
Explora el concepto de funciones de orden superior en tu lenguaje
6+
creando ejemplos simples (a tu elección) que muestren su funcionamiento.
7+
"""
8+
# funcion como argumento
9+
10+
11+
def apply_func(func, x):
12+
return func(x)
13+
14+
15+
x = apply_func(len, "Aldroide")
16+
print(x)
17+
18+
# retorno de funcion
19+
20+
21+
def apply_mult(n):
22+
def mult(x):
23+
return x*n
24+
return (mult)
25+
26+
27+
x = apply_mult(2)
28+
29+
mult = apply_mult(2)
30+
print(mult(5))
31+
32+
# Sistema
33+
numbers = [1, 3, 4, 2, 5]
34+
35+
# map
36+
37+
38+
def apply_double(n):
39+
return n*2
40+
41+
42+
print(list(map(apply_double, numbers)))
43+
44+
45+
# filter
46+
def is_even(n):
47+
return n % 2 == 0
48+
49+
50+
print(list(filter(is_even, numbers)))
51+
52+
# sorted()
53+
print(sorted(numbers))
54+
print(sorted(numbers, reverse=True))
55+
print(sorted(numbers, key=lambda x: -x))
56+
57+
# reduce()
58+
59+
60+
def sum_values(x, y):
61+
return x + y
62+
63+
64+
print(reduce(sum_values, numbers))
65+
66+
67+
"""
68+
DIFICULTAD EXTRA (opcional):
69+
Dada una lista de estudiantes (con sus nombres, fecha de nacimiento y
70+
lista de calificaciones), utiliza funciones de orden superior para
71+
realizar las siguientes operaciones de procesamiento y análisis:
72+
Promedio calificaciones: Obtiene una lista de estudiantes por nombre
73+
promedio de sus calificaciones.
74+
Mejores estudiantes: Obtiene una lista con el nombre de los estudiantes
75+
que tienen calificaciones con un 9 o más de promedio.
76+
Nacimiento: Obtiene una lista de estudiantes ordenada desde el más joven.
77+
Mayor calificación: Obtiene la calificación más alta de entre todas las
78+
de los alumnos.
79+
Una calificación debe estar comprendida entre 0 y 10 (admite decimales).
80+
"""
81+
82+
students = [
83+
{"name": "Aldroide", "birthdate": "29-04-1983",
84+
"grades": [9.5, 8.5, 9.9, 10]},
85+
{"name": "Richard", "birthdate": "04-08-1983", "grades": [7.5, 9.5, 7, 6]},
86+
{"name": "Emmanuel", "birthdate": "15-12-2000",
87+
"grades": [6, 8.5, 9.5, 8.2]},
88+
{"name": "Samira", "birthdate": "25-01-1980", "grades": [10, 9, 9.7, 9.9]}
89+
]
90+
91+
92+
def average(grades):
93+
return sum(grades)/len(grades)
94+
95+
96+
# Promedio
97+
print(
98+
list(map(lambda student: {
99+
"name": student["name"],
100+
"average": average(student["grades"])}, students)
101+
)
102+
)
103+
104+
105+
# Mejores
106+
print(
107+
list(map(lambda student:
108+
student["name"],
109+
filter(lambda student: average(student["grades"]) >= 9, students)
110+
)
111+
)
112+
)
113+
114+
# Fecha de naciemiento ordenada
115+
print(sorted(students, key=lambda student: datetime.strptime(
116+
student["birthdate"], "%d-%m-%Y"), reverse=True))
117+
118+
119+
# Califiación más alta
120+
121+
print(max(map(lambda student: max(student["grades"]), students)))
+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
"""
2+
Explora el concepto de funciones de orden superior en tu lenguaje
3+
creando ejemplos simples (a tu elección) que muestren su funcionamiento.
4+
"""
5+
6+
7+
class Singleton():
8+
_instance = None
9+
10+
def __new__(cls):
11+
if not cls._instance:
12+
cls._instance = super(Singleton, cls).__new__(cls)
13+
return cls._instance
14+
15+
16+
singleton1 = Singleton()
17+
print(singleton1)
18+
singleton2 = Singleton()
19+
print(singleton2)
20+
21+
"""
22+
Dada una lista de estudiantes (con sus nombres, fecha de nacimiento y
23+
lista de calificaciones), utiliza funciones de orden superior para
24+
realizar las siguientes operaciones de procesamiento y análisis:
25+
- Promedio calificaciones: Obtiene una lista de estudiantes por nombre
26+
y promedio de sus calificaciones.
27+
- Mejores estudiantes: Obtiene una lista con el nombre de los estudiantes
28+
que tienen calificaciones con un 9 o más de promedio.
29+
- Nacimiento: Obtiene una lista de estudiantes ordenada desde el más joven.
30+
- Mayor calificación: Obtiene la calificación más alta de entre todas las
31+
de los alumnos.
32+
- Una calificación debe estar comprendida entre 0 y 10 (admite decimales).
33+
34+
"""
35+
36+
37+
class UserSession():
38+
_instance = None
39+
40+
id = int
41+
username = str
42+
name = str
43+
email = str
44+
45+
def __new__(cls):
46+
if not cls._instance:
47+
cls._instance = super(UserSession, cls).__new__(cls)
48+
return cls._instance
49+
50+
def set_user(self, id, name, username, email):
51+
self.id = id
52+
self.username = username
53+
self.name = name
54+
self.email = email
55+
56+
def get_user(self):
57+
return f"{self.id},{self.username},{self.name},{self.email}"
58+
59+
def clear_user(self):
60+
self.id = None
61+
self.username = None
62+
self.name = None
63+
self.email = None
64+
65+
66+
session1 = UserSession()
67+
print(session1.get_user())
68+
session1.set_user(1, "aldroide", "Aldo AC", "aldroidegmail.com")
69+
print(session1.get_user())
70+
71+
session2 = UserSession()
72+
print(session2.get_user())
73+
74+
session3 = UserSession()
75+
session3.clear_user()
76+
print(session3.get_user())
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"""
2+
Ejercicio
3+
Explora el concepto de "decorador" y muestra cómo crearlo con un ejemplo genérico
4+
"""
5+
6+
7+
def mi_decorador(func):
8+
def funcion_(a, b):
9+
print("Antes de llamar a la función")
10+
resultado = func(a, b)
11+
print("Se llamo la función")
12+
return resultado
13+
return funcion_
14+
15+
16+
@mi_decorador
17+
def suma(a, b):
18+
print("Entró a funcion suma")
19+
return a+b
20+
21+
22+
@mi_decorador
23+
def resta(a, b):
24+
print("Entró a función resta")
25+
return a-b
26+
27+
28+
r = suma(4, 5)
29+
print(r)
30+
r = resta(5, 3)
31+
print(r)
32+
33+
34+
"""
35+
Crea un decorador que sea capaz de contabilizar cuántas veces
36+
se ha llamado a una función y aplícalo a una función de tu elección.
37+
"""
38+
39+
40+
def count_call(func):
41+
def new_func():
42+
new_func.contador += 1
43+
print(
44+
f"La función '{func.__name__}' ha sido llamada {new_func.contador} veces")
45+
return func
46+
new_func.contador = 0
47+
return new_func
48+
49+
50+
@count_call
51+
def my_func():
52+
print("Ejecutanto la funcion")
53+
54+
55+
my_func()
56+
my_func()
57+
my_func()

0 commit comments

Comments
 (0)