Skip to content

Commit db4cf40

Browse files
authored
Merge pull request #9043 from barrancus/patch-3
#22 - Python
2 parents d0c6ac2 + 24cffa7 commit db4cf40

File tree

1 file changed

+242
-0
lines changed

1 file changed

+242
-0
lines changed
Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
# 22 - Python
2+
#
3+
# EJERCICIO:
4+
# Explora el concepto de funciones de orden superior en tu lenguaje
5+
# creando ejemplos simples (a tu elección) que muestren su funcionamiento.
6+
#
7+
# DIFICULTAD EXTRA (opcional):
8+
# Dada una lista de estudiantes (con sus nombres, fecha de nacimiento y
9+
# lista de calificaciones), utiliza funciones de orden superior para
10+
# realizar las siguientes operaciones de procesamiento y análisis:
11+
# - Promedio calificaciones: Obtiene una lista de estudiantes por nombre
12+
# y promedio de sus calificaciones.
13+
# - Mejores estudiantes: Obtiene una lista con el nombre de los estudiantes
14+
# que tienen calificaciones con un 9 o más de promedio.
15+
# - Nacimiento: Obtiene una lista de estudiantes ordenada desde el más joven.
16+
# - Mayor calificación: Obtiene la calificación más alta de entre todas las
17+
# de los alumnos.
18+
# - Una calificación debe estar comprendida entre 0 y 10 (admite decimales).
19+
#
20+
from random import randint, choice
21+
from functools import reduce, partial
22+
23+
class Counter:
24+
def __iter__(self):
25+
self.a = 1
26+
return self
27+
28+
def __next__(self):
29+
x = self.a
30+
self.a += 1
31+
return x
32+
33+
def serparacion(cadena) -> str:
34+
global contador
35+
print(f'\nEjercicio {next(contador)}. {cadena * 20}')
36+
37+
contador = iter(Counter())
38+
39+
students = [
40+
{
41+
"nombre": "Sofía Martínez",
42+
"fecha_nacimiento": "2005-03-14",
43+
"calificaciones": [8.5, 9.0, 9.5, 8.8]
44+
},
45+
{
46+
"nombre": "Alejandro López",
47+
"fecha_nacimiento": "2004-11-22",
48+
"calificaciones": [7.0, 6.5, 7.8, 6.0]
49+
},
50+
{
51+
"nombre": "Valeria González",
52+
"fecha_nacimiento": "2005-01-10",
53+
"calificaciones": [9.8, 10.0, 9.9, 9.5]
54+
},
55+
{
56+
"nombre": "Diego Rodríguez",
57+
"fecha_nacimiento": "2004-07-05",
58+
"calificaciones": [5.5, 6.0, 5.0, 6.2]
59+
},
60+
{
61+
"nombre": "Camila Fernández",
62+
"fecha_nacimiento": "2005-09-30",
63+
"calificaciones": [8.0, 8.5, 7.5, 8.2]
64+
},
65+
{
66+
"nombre": "Mateo Sánchez",
67+
"fecha_nacimiento": "2004-05-18",
68+
"calificaciones": [6.5, 7.0, 6.8, 7.2]
69+
},
70+
{
71+
"nombre": "Isabella Pérez",
72+
"fecha_nacimiento": "2005-12-03",
73+
"calificaciones": [9.0, 9.2, 8.8, 9.5]
74+
},
75+
{
76+
"nombre": "Santiago Gómez",
77+
"fecha_nacimiento": "2004-02-14",
78+
"calificaciones": [7.5, 7.0, 8.0, 7.8]
79+
},
80+
{
81+
"nombre": "Valentina Ruiz",
82+
"fecha_nacimiento": "2005-06-21",
83+
"calificaciones": [8.8, 8.5, 9.0, 8.2]
84+
},
85+
{
86+
"nombre": "Daniel Díaz",
87+
"fecha_nacimiento": "2004-08-09",
88+
"calificaciones": [6.0, 5.8, 6.5, 6.2]
89+
},
90+
{
91+
"nombre": "Lucía Hernández",
92+
"fecha_nacimiento": "2005-04-17",
93+
"calificaciones": [9.5, 9.8, 9.2, 9.7]
94+
},
95+
{
96+
"nombre": "Nicolás Álvarez",
97+
"fecha_nacimiento": "2004-10-25",
98+
"calificaciones": [7.2, 7.5, 7.0, 7.8]
99+
},
100+
{
101+
"nombre": "Mariana Torres",
102+
"fecha_nacimiento": "2005-02-05",
103+
"calificaciones": [8.2, 8.0, 8.5, 8.1]
104+
},
105+
{
106+
"nombre": "Samuel Flores",
107+
"fecha_nacimiento": "2004-12-12",
108+
"calificaciones": [5.0, 5.5, 6.0, 5.2]
109+
},
110+
{
111+
"nombre": "Gabriela Romero",
112+
"fecha_nacimiento": "2005-08-28",
113+
"calificaciones": [9.0, 8.8, 9.2, 9.5]
114+
},
115+
{
116+
"nombre": "Felipe Castillo",
117+
"fecha_nacimiento": "2004-03-08",
118+
"calificaciones": [7.8, 7.5, 8.0, 7.2]
119+
},
120+
{
121+
"nombre": "Victoria Medina",
122+
"fecha_nacimiento": "2005-11-15",
123+
"calificaciones": [8.5, 8.2, 8.8, 8.5]
124+
},
125+
{
126+
"nombre": "Emiliano Silva",
127+
"fecha_nacimiento": "2004-06-02",
128+
"calificaciones": [6.2, 6.5, 6.0, 6.8]
129+
},
130+
{
131+
"nombre": "Ximena Castro",
132+
"fecha_nacimiento": "2005-05-20",
133+
"calificaciones": [9.2, 9.5, 9.0, 9.8]
134+
},
135+
{
136+
"nombre": "Andrés Morales",
137+
"fecha_nacimiento": "2004-09-11",
138+
"calificaciones": [7.0, 7.2, 6.8, 7.5]
139+
},
140+
{
141+
"nombre": "Renata Ortega",
142+
"fecha_nacimiento": "2005-07-29",
143+
"calificaciones": [8.0, 8.2, 7.8, 8.5]
144+
},
145+
{
146+
"nombre": "Joaquín Vargas",
147+
"fecha_nacimiento": "2004-01-30",
148+
"calificaciones": [5.8, 6.0, 5.5, 6.2]
149+
},
150+
{
151+
"nombre": "Elena Navarro",
152+
"fecha_nacimiento": "2005-10-08",
153+
"calificaciones": [9.8, 9.5, 9.2, 9.9]
154+
},
155+
{
156+
"nombre": "Gabriel Mendoza",
157+
"fecha_nacimiento": "2004-04-22",
158+
"calificaciones": [7.5, 7.8, 7.2, 8.0]
159+
},
160+
{
161+
"nombre": "Daniela Rojas",
162+
"fecha_nacimiento": "2005-03-01",
163+
"calificaciones": [8.5, 8.8, 8.2, 8.9]
164+
},
165+
{
166+
"nombre": "Adrián Cruz",
167+
"fecha_nacimiento": "2004-12-20",
168+
"calificaciones": [6.5, 6.8, 6.2, 7.0]
169+
}
170+
]
171+
172+
def func_superior_order() -> None:
173+
serparacion('-:-')
174+
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
175+
print(f'Numeros iniciales: {numbers}')
176+
print(f'Funcion de orden superior map(lambda x: x**2, numbers): {list(map(lambda x: x**2, numbers))}')
177+
print(f'Funcion de orden superior filter(lambda x: x % 2 == 0, numbers): {list(filter(lambda x: x % 2 == 0, numbers))}')
178+
print(f'Funcion de orden superior reduce(lambda x, y: x + y, numbers): {reduce(lambda x, y: x + y, numbers)}')
179+
print(f'Funcion de orden superior sorted(numbers, reverse=True): {sorted(numbers, reverse=True)}')
180+
basetwo = partial(int, base=2)
181+
basetwo.__doc__ = 'Convert base 2 string to an int.'
182+
basetwo.__name__ = 'basetwo'
183+
print(f'Funcion de orden superior partial(int, base=2): {basetwo.__doc__}')
184+
print(basetwo('10010'))
185+
print(f'bin(18): {bin(18)}')
186+
187+
def extra() -> None:
188+
serparacion('-:-')
189+
while True:
190+
print('\nPor favor serlecciona una de las opciones a mostrar:')
191+
print('1 - Promedio calificaciones de los estudiantes.')
192+
print('2 - Mostrar los mejores estudiantes (promedio >= 9).')
193+
print('3 - Mostrar estudiantes ordenados desde el más joven.')
194+
print('4 - Mostrar la mayor calificación entre todos los estudiantes.')
195+
print('0 - Salir.')
196+
option = input('Opción seleccionada: ')
197+
match option:
198+
case '1':
199+
print(f"\n{'Nombre':<20} | {'Promedio':<10}")
200+
print("-" * 33)
201+
for student in students:
202+
print(f"{student['nombre']:<20} | {average_grades(student["calificaciones"]):.2f}")
203+
case '2':
204+
print(f"\n{'Nombre':<20} | {'Promedio':<10}")
205+
print("-" * 33)
206+
for student in students:
207+
aver = list(best_average_grades(student["calificaciones"]))
208+
if len(aver) > 0: print(f"{student['nombre']:<20} | {aver[0]:.2f}")
209+
case '3':
210+
print(f"\n{'Nombre':<20} | {'Fecha Nacimiento':<18}")
211+
print("-" * 41)
212+
for student in sorted(students, key=lambda x: x["fecha_nacimiento"], reverse=True):
213+
print(f"{student['nombre']:<20} | {student["fecha_nacimiento"]}")
214+
case '4':
215+
print(f"\n{'Nombre':<20} | {'Promedio':<10}")
216+
print("-" * 33)
217+
highest_grade_value = highest_grade(students)
218+
for student in students:
219+
if max(student["calificaciones"]) == highest_grade_value:
220+
print(f"{student['nombre']:<20} | {max(student['calificaciones']):.2f}")
221+
case '0':
222+
print('\nSalir.')
223+
break
224+
case _:
225+
print('\nOpción no válida. Por favor, intenta de nuevo.')
226+
227+
def average_grades(grades: list) -> float:
228+
return reduce(lambda x, y: x + y, grades) / len(grades)
229+
230+
def best_average_grades(grades: list) -> filter:
231+
return filter(lambda x: x >= 9, [average_grades(grades)])
232+
233+
def highest_grade(students: list) -> float:
234+
return max(list(map(lambda student: max(student["calificaciones"]), students)))
235+
236+
def main():
237+
print('\nFUNCIONES DE ORDEN SUPERIOR')
238+
func_superior_order()
239+
extra()
240+
241+
if __name__ == '__main__':
242+
main()

0 commit comments

Comments
 (0)