Módulo Functools de Python

El módulo functools contiene herramientas para funciones de orden superior como partial, reduce y lru_cache.

import functools

Las funciones de orden superior son funciones que trabajan con otras funciones. Quienes empiezan suelen usar functools para reutilizar una función con algunos argumentos fijados, o para guardar en caché resultados costosos.

partial()

partial crea un nuevo objeto invocable con algunos argumentos ya completados.

from functools import partial

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

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

Esto es útil cuando otra función espera un invocable con 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 un iterable en un solo valor.

from functools import reduce

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

Para sumas simples, prefiere la función integrada sum(). reduce es más útil cuando la operación de combinación es 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 los resultados de una función.

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

Puedes inspeccionar el uso de la caché:

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

Enlaces relacionados