Módulo Functools do Python

O módulo functools contém ferramentas para funções de ordem superior como partial, reduce e lru_cache.

import functools

Funções de ordem superior são funções que trabalham com outras funções. Quem está começando costuma usar functools para reutilizar uma função com alguns argumentos fixos ou para armazenar em cache resultados caros.

partial()

partial cria um novo callable com alguns argumentos já preenchidos.

from functools import partial

def power(base, exponent):
    return base ** exponent

square = partial(power, exponent=2)
print(square(5))
25

Isso é útil quando outra função espera um callable com menos argumentos.

from functools import partial

def greet(greeting, name):
    return f'{greeting}, {name}!'

say_hello = partial(greet, 'Hello')
print(say_hello('Ada'))
Hello, Ada!

reduce()

reduce combina um iterável em um único valor.

from functools import reduce

total = reduce(lambda acc, item: acc + item, [1, 2, 3, 4])
print(total)
10

Para somas simples, prefira a função embutida sum(). reduce é mais útil quando a operação de combinação é personalizada.

from functools import reduce

words = ['Python', 'Cheatsheet']
title = reduce(lambda left, right: f'{left} {right}', words)
print(title)
Python Cheatsheet

lru_cache()

lru_cache memoriza resultados de funções.

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(10))
55

Você pode inspecionar o uso do cache.

print(fibonacci.cache_info().hits > 0)
True