Funções de ordem superior personalizadas

Funções como sort, max ou min podem receber argumentos como key=, que são funções e podem determinar seu comportamento. Isso torna as funções embutidas sort e max muito mais poderosas e genéricas. Elas podem ser usadas em muitos mais cenários do que se apenas comparassem os valores em si sem o argumento key=.
Podemos criar nossas próprias funções de ordem superior também:
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']
Aqui, passamos diferentes funções como f para a função de ordem superior modify. A função modify cria uma nova lista a partir da lista de entrada e retorna o resultado. Note que podemos até passar uma função como str para a função. Assim, cada elemento da lista de entrada terá aplicada a função str() - str(2), str(0), str(1).

Desafio

Implemente uma versão genérica da função sum chamada generic_sum, que receberá uma coleção como primeiro argumento (pode ser uma lista, um conjunto ou uma lista de tuplas) e uma função como segundo argumento que obtém um número de cada elemento da coleção.
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