|  | 
|  | 1 | +### FUNCIONES DE ORDEN SUPERIOR EN PYTHON | 
|  | 2 | + | 
|  | 3 | +''' | 
|  | 4 | +Una función de orden superior es aquella que: | 
|  | 5 | + Acepta una función como argumento. | 
|  | 6 | + Devuelve otra función como resultado. | 
|  | 7 | + O ambas cosas. | 
|  | 8 | +''' | 
|  | 9 | + | 
|  | 10 | +# Ejemplo de función que acepta otra como argumento: | 
|  | 11 | +def calculator(x: float, y: float, operation) -> float: | 
|  | 12 | +    return operation(x, y) | 
|  | 13 | + | 
|  | 14 | +def sum(a: float, b: float) -> float: | 
|  | 15 | +    return a + b | 
|  | 16 | + | 
|  | 17 | +def product(a: float, b: float) -> float: | 
|  | 18 | +    return a * b | 
|  | 19 | + | 
|  | 20 | +print(calculator(10,20, sum)) # Salida 30 | 
|  | 21 | +print(calculator(10,20, product)) # Salida 200 | 
|  | 22 | + | 
|  | 23 | +# Ejemplo devolviendo otra función como resultado (lambda): | 
|  | 24 | +def new_calculator(operation): | 
|  | 25 | +    if operation.lower() == "sum": | 
|  | 26 | +        return lambda a, b: a + b | 
|  | 27 | +    elif operation.lower() == "product": | 
|  | 28 | +        return lambda a, b: a * b | 
|  | 29 | +    else: | 
|  | 30 | +        return lambda a, b: None | 
|  | 31 | + | 
|  | 32 | +my_sum = new_calculator("sum") | 
|  | 33 | +my_product = new_calculator("product") | 
|  | 34 | + | 
|  | 35 | +print(my_sum(5,5)) # Salida 10 | 
|  | 36 | +print(my_product(5,5)) # Salida 25 | 
|  | 37 | + | 
|  | 38 | +# Python ofrece varias funciones de orden superior predefinidas, como map, filter, y reduce. | 
|  | 39 | + | 
|  | 40 | +my_list = [i for i in range(1,11)] | 
|  | 41 | + | 
|  | 42 | +square = map(lambda x: x**2, my_list) | 
|  | 43 | +print(list(square)) | 
|  | 44 | + | 
|  | 45 | +pairs = filter(lambda x: x%2 == 0, my_list) | 
|  | 46 | + | 
|  | 47 | +print(list(pairs)) | 
|  | 48 | + | 
|  | 49 | +# Para reduce necesitamos importar functools | 
|  | 50 | +from functools import reduce | 
|  | 51 | + | 
|  | 52 | +sum = reduce(lambda x, y: x + y, my_list) | 
|  | 53 | +print(sum) # Salida 55 | 
|  | 54 | + | 
|  | 55 | +### EJERCICIO EXTRA | 
|  | 56 | +students = [ | 
|  | 57 | +    { | 
|  | 58 | +        "name": "Manuel Rodriguez", | 
|  | 59 | +        "birth_date": "2002-05-14", | 
|  | 60 | +        "grades": [8.5, 7.0, 9.0, 6.5] | 
|  | 61 | +    }, | 
|  | 62 | +    { | 
|  | 63 | +        "name": "Lucia Perez", | 
|  | 64 | +        "birth_date": "2003-11-22", | 
|  | 65 | +        "grades": [7.5, 9.0, 8.0, 9.5] | 
|  | 66 | +    }, | 
|  | 67 | +    { | 
|  | 68 | +        "name": "Pedro Sanchez", | 
|  | 69 | +        "birth_date": "2001-08-05", | 
|  | 70 | +        "grades": [6.0, 5.5, 7.0, 6.5] | 
|  | 71 | +    }, | 
|  | 72 | +    { | 
|  | 73 | +        "name": "Ana Fernandez", | 
|  | 74 | +        "birth_date": "2004-01-30", | 
|  | 75 | +        "grades": [9.0, 8.5, 9.5, 10.0] | 
|  | 76 | +    }, | 
|  | 77 | +    { | 
|  | 78 | +        "name": "Carlos Garcia", | 
|  | 79 | +        "birth_date": "2002-07-19", | 
|  | 80 | +        "grades": [7.0, 7.5, 6.0, 8.0] | 
|  | 81 | +    } | 
|  | 82 | +] | 
|  | 83 | + | 
|  | 84 | +# Promedio de calificaciones: | 
|  | 85 | +def analysis(iterable: list, operation): | 
|  | 86 | +    return operation(iterable) | 
|  | 87 | + | 
|  | 88 | +def avg(iterable: list) ->list: | 
|  | 89 | +     | 
|  | 90 | +    avg_students = [] | 
|  | 91 | +     | 
|  | 92 | +    for element in iterable: | 
|  | 93 | +        avg = 0 | 
|  | 94 | +        for grade in element["grades"]: | 
|  | 95 | +            avg += grade | 
|  | 96 | +        avg /= len(element["grades"]) | 
|  | 97 | +         | 
|  | 98 | +        avg_students.append({ | 
|  | 99 | +            "name": element["name"], | 
|  | 100 | +            "avg": avg | 
|  | 101 | +        }) | 
|  | 102 | +         | 
|  | 103 | +    return avg_students | 
|  | 104 | + | 
|  | 105 | +avg_students = analysis(students, avg) | 
|  | 106 | + | 
|  | 107 | +print(list(avg_students)) | 
|  | 108 | + | 
|  | 109 | +# Aprovechamos la lista avg_students para obtener los mejores estudiantes, en este caso usaremos filter | 
|  | 110 | +best_students = filter(lambda x: x['avg'] >=9 and x['avg']<=10, avg_students) | 
|  | 111 | +print(list(best_students)) | 
|  | 112 | + | 
|  | 113 | +# Lista de estudiantes ordenada por fecha de nacimiento | 
|  | 114 | +students_by_birthday = sorted(students, key=lambda p: p['birth_date']) | 
|  | 115 | +print(list(students_by_birthday)) | 
|  | 116 | + | 
|  | 117 | +# Obtención de la nota más alta de entre todas las obtenidas por los estudiantes | 
|  | 118 | +max_grade = reduce(lambda x,y: max(x,y), [grade for student in students for grade in student["grades"]]) | 
|  | 119 | +print(max_grade) | 
|  | 120 | + | 
|  | 121 | +### FIN EJERCICIO EXTRA | 
|  | 122 | + | 
|  | 123 | + | 
|  | 124 | +### FIN FUNCIONES DE ORDEN SUPERIOR EN PYTHON | 
0 commit comments