Funciones de orden superior personalizadas

Funciones como sort, max o min pueden recibir argumentos como key= que son funciones y pueden determinar su comportamiento. Esto hace que las funciones incorporadas sort y max sean mucho más poderosas y genéricas. Pueden utilizarse en muchos más escenarios que si solo compararan los valores en sí mismos sin el argumento key=.
Podemos crear nuestras propias funciones de orden superior también:
def modify(numbers, f):
    res = [f(n) for n in numbers]
    return res

print(modify([1, 2, 3], lambda x: x**2))   # [1, 4, 9]
print(modify([1, 2, 3], lambda x: -x))     # [-1, -2, -3]
print(modify([2, 0, 1], lambda x: 2 * x))  # [4, 0, 2]
print(modify([2, 0, 1], str))              # ['2', '0', '1']
Aquí pasamos diferentes funciones como f a la función de orden superior modify. La función modify crea una nueva lista a partir de la lista de entrada y devuelve el resultado. Observa que incluso podemos pasar una función como str a la función. Así, a cada elemento de la lista de entrada se le aplicará la función str()str(2), str(0), str(1).

Desafío

Implementa una versión genérica de la función sum llamada generic_sum que tomará una colección como primer argumento (puede ser una lista, un conjunto o una lista de tuplas) y una función como segundo argumento que obtenga un número de cada elemento de la colección.
def generic_sum():
    ...

print(generic_sum([1, 2, 3], lambda x: x))                   # 6
print(generic_sum({1, 2, 3}, lambda x: x))                   # 6
print(generic_sum([(1, 3), (4, 6)], lambda x: x[0] + x[1]))  # 14
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue