Skip to content

Commit 629c516

Browse files
authored
Merge pull request mouredev#7175 from danielhdzr/main
#21 - Python
2 parents 9cfdba4 + 356dc4f commit 629c516

File tree

1 file changed

+126
-0
lines changed

1 file changed

+126
-0
lines changed
+126
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# #21 CALLBACKS
2+
# Dificultad: Media | Publicación: 20/04/24 | Corrección: 27/05/24
3+
4+
## Ejercicio
5+
6+
7+
'''/*
8+
* EJERCICIO:
9+
* Explora el concepto de callback en tu lenguaje creando un ejemplo
10+
* simple (a tu elección) que muestre su funcionamiento.
11+
*/
12+
'''
13+
# Ej. 1 Callback sincrono
14+
# Definicion de una funcion
15+
def saludo(callback): # Parametro callback
16+
print("Antes del callback")
17+
callback() # Llamado a funcion
18+
print("Después del callback")
19+
20+
# Definicion de una funcion
21+
def decir_hola():
22+
print("¡Hola!")
23+
24+
# Llamado a funcion
25+
saludo(decir_hola)
26+
''' Toma como arg. a la funcion decir_hola() que sustituye el parametro callback,
27+
ahora decir_hola() sera llamada dentro de la funcion saludo en lugar de la funcion callback()'''
28+
29+
'''/////////////////////////////////////////////////////////////////////////'''
30+
# Ej. 2 Callback asincrono
31+
import time
32+
import threading
33+
34+
# Definicion de una funcion
35+
def mi_callback(resultado):
36+
print(f"Resultado procesado: {resultado}")
37+
38+
# Definicion de una funcion
39+
def tarea_larga(callback):
40+
print("Iniciando tarea...")
41+
time.sleep(2) # Simulación de tarea larga
42+
resultado = "Tarea completada"
43+
callback(resultado)
44+
45+
# Llamada en un hilo separado
46+
threading.Thread(target=tarea_larga, args=(mi_callback,)).start() # (Objeto, arg.,) inicio
47+
48+
# Ej. 3
49+
def mi_callback(resultado):
50+
print(f"El resultado es: {resultado}")
51+
52+
def operacion_asincrona(callback):
53+
resultado = 42 # Simulación de un resultado
54+
callback(resultado) # Llama al callback con el resultado
55+
56+
# Usar el callback
57+
operacion_asincrona(mi_callback)
58+
print()
59+
60+
'''
61+
* DIFICULTAD EXTRA (opcional):
62+
* Crea un simulador de pedidos de un restaurante utilizando callbacks.
63+
* Estará formado por una función que procesa pedidos.
64+
* Debe aceptar el nombre del plato, una callback de confirmación, una
65+
* de listo y otra de entrega.
66+
* - Debe imprimir un confirmación cuando empiece el procesamiento.
67+
* - Debe simular un tiempo aleatorio entre 1 a 10 segundos entre
68+
* procesos.
69+
* - Debe invocar a cada callback siguiendo un orden de procesado.
70+
* - Debe notificar que el plato está listo o ha sido entregado.
71+
'''
72+
73+
# Simulador de pedidos de restaurante
74+
import asyncio
75+
import random
76+
77+
# Lapso aleatorio para cada etapa
78+
def generar_lapso():
79+
return random.uniform(1, 10)
80+
81+
# Función principal que inicia el proceso
82+
async def funcion_principal(orden):
83+
print(f"Pedido recibido: {orden}")
84+
# Iniciar la cadena de callbacks
85+
await pedido(orden, confirmacion_pedido)
86+
87+
# Pedido
88+
async def pedido(orden, callback):
89+
lapso = generar_lapso()
90+
print(f"Procesando pedido: {orden} (espera de {lapso:.2f} segundos)")
91+
await asyncio.sleep(lapso)
92+
print(f"Pedido {orden} realizado")
93+
# Llamar al siguiente callback
94+
await callback(orden, pedido_listo)
95+
96+
# Confirmación del pedido
97+
async def confirmacion_pedido(orden, callback):
98+
lapso = generar_lapso()
99+
print(f"Confirmando pedido: {orden} (espera de {lapso:.2f} segundos)")
100+
await asyncio.sleep(lapso)
101+
print(f"Pedido {orden} confirmado")
102+
# Llamar al siguiente callback
103+
await callback(orden, pedido_entregado)
104+
105+
# Pedido listo
106+
async def pedido_listo(orden, callback):
107+
lapso = generar_lapso()
108+
print(f"Preparando pedido: {orden} (espera de {lapso:.2f} segundos)")
109+
await asyncio.sleep(lapso)
110+
print(f"Pedido {orden} listo")
111+
# Llamar al siguiente callback
112+
await callback(orden, None)
113+
114+
# Pedido entregado
115+
async def pedido_entregado(orden, callback):
116+
lapso = generar_lapso()
117+
print(f"Entregando pedido: {orden} (espera de {lapso:.2f} segundos)")
118+
await asyncio.sleep(lapso)
119+
print(f"Pedido {orden} entregado. ¡Gracias por tu compra!")
120+
# Este es el último paso, no hay más callbacks
121+
122+
# Capturar la orden
123+
orden = input("Platillo a ordenar: ")
124+
125+
# Ejecutar el flujo
126+
asyncio.run(funcion_principal(orden))

0 commit comments

Comments
 (0)