|
| 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