Skip to content

functools Python: Funções de Ordem Superior e Operações em Objetos Chamáveis

Updated on

Python, uma linguagem de programação de alto nível, é conhecida por sua simplicidade e legibilidade. Uma das muitas características que fazem o Python se destacar é sua extensa biblioteca padrão, que inclui uma variedade de módulos para simplificar o processo de codificação. Entre esses módulos, o módulo functools é uma ferramenta poderosa que fornece funções de ordem superior e operações em objetos chamáveis. Este artigo explorará as funcionalidades do módulo functools, fornecendo explicações detalhadas, definições e exemplos.

O módulo functools faz parte da biblioteca padrão do Python, projetado para fornecer recursos que tornam mais fácil trabalhar com funções de ordem superior. Uma função de ordem superior é uma função que recebe outra função como argumento ou retorna uma função. Essa capacidade permite uma maior flexibilidade e reutilização no código, permitindo que os desenvolvedores escrevam um código mais eficiente e limpo.

Deseja criar rapidamente visualizações de dados a partir de um dataframe do Pandas com nenhum código?

PyGWalker é uma biblioteca Python para Análise Exploratória de Dados com Visualização. PyGWalker (opens in a new tab) pode simplificar seu fluxo de trabalho de análise e visualização de dados no Jupyter Notebook, transformando seu dataframe do pandas (e o dataframe do polars) em uma interface de usuário no estilo do Tableau para exploração visual.

PyGWalker para visualização de dados (opens in a new tab)

Parte 1: Entendendo o módulo functools

O módulo functools no Python é uma coleção de funções de ordem superior. Uma função de ordem superior é uma função que pode receber uma ou mais funções como argumentos ou retornar uma função como resultado. Esse conceito é um aspecto fundamental da programação funcional, um paradigma em que as funções são cidadãos de primeira classe e podem ser passadas e usadas como qualquer outro tipo de dados.

O módulo functools fornece várias funções que podem ser usadas para manipular e combinar outras funções. Estas incluem:

  • functools.reduce(): Esta função aplica uma função binária (uma função que recebe dois argumentos) a um iterável de forma cumulativa. Por exemplo, se a função for soma, e o iterável for uma lista de números, reduce() retornará a soma de todos os números na lista.

  • functools.partial(): Esta função permite fixar um determinado número de argumentos de uma função e gerar uma nova função. Isso pode ser particularmente útil quando você deseja "lembrar" de certos argumentos de uma função.

  • functools.wraps(): Este é um decorador que atualiza os atributos da função de envolvimento para os da função original. Isso é útil quando você usa decoradores, pois mantém os metadados da função original.

Parte 2: Usos práticos do functools

O módulo functools não é apenas um conceito teórico, mas tem usos práticos em aplicações do mundo real. Vamos ver alguns exemplos de como você pode usar functools em seu código Python.

functools.reduce()

A função functools.reduce() é uma ferramenta poderosa que pode ser usada para processar e acumular dados de um iterável. Aqui está um exemplo:

de functools importar reduce
 
números = [1, 2, 3, 4, 5]
resultado = reduce(lambda x, y: x * y, números)
 
imprimir(resultado)  # Saída: 120

Neste exemplo, reduce() recebe dois argumentos: uma função e um iterável. A função é uma função lambda que recebe dois argumentos e retorna o produto deles. O iterável é uma lista de números. reduce() aplica a função aos elementos do iterável de forma cumulativa: primeiro aplica a função aos dois primeiros elementos, depois ao resultado e ao próximo elemento, e assim por diante. O resultado é o produto de todos os elementos da lista.

functools.partial()

A função functools.partial() permite fixar um determinado número de argumentos de uma função e gerar uma nova função. Isso pode ser particularmente útil quando você deseja "lembrar" de certos argumentos de uma função. Aqui está um exemplo:

de functools importar partial
 
def multiplicar(x, y):
    retornar x * y
 
# Crie uma nova função que multiplica por 2
dobro = partial(multiplicar, 2)
 
imprimir(dobro(4))  # Saída: 8

Neste exemplo, partial() é usado para criar uma nova função dobro() que multiplica seu argumento por 2. Isso é feito fixando o primeiro argumento da função multiplicar() em 2.

functools.wraps()

A função functools.wraps() é um decorador que é usado para indicar que uma função envolve outra função. Isso é útil quando você usa decoradores, pois mantém os metadados da função original. Aqui está um exemplo:

de functools importar wraps
 
def meu_decorador(f):
    @wraps(f)
    def envoltório(*args, **kwargs):
        imprimir("Antes de chamar a função")
        resultado = f(*args, **kwargs)
        imprimir("Depois de chamar a função")
        return resultado
    return envoltório
 
@meu_decorador
def adicionar(x, y):
    """Adiciona dois números"""
    retornar x + y
 
imprimir(adicionar.__name__)  # Saída: adicionar
imprimir(adicionar.__doc__)   # Saída: Adiciona dois números

Neste exemplo, wraps() é usado na definição de um decorador meu_decorador(). O decorador adiciona algum comportamento (imprimindo mensagens) antes e depois de chamar a função que ele decora. Usando wraps(), os metadados da função original (seu nome e docstring) são preservados.

Parte 3: functools vs itertools

A biblioteca padrão do Python também inclui outro módulo para lidar com operações em iteráveis: itertools. Enquanto functools fornece funções de alta ordem e operações em objetos chamáveis, itertools fornece um conjunto de ferramentas para criar iteradores. Estas podem ser utilizadas para loop eficiente, gerar permutações e combinações, e outras tarefas de manipulação de dados.

Os módulos functools e itertools se complementam e frequentemente podem ser usados em conjunto. Por exemplo, você pode usar itertools.cycle() para criar um iterador infinito e functools.partial() para criar uma função que gera um número finito de elementos a partir deste iterador.

Em conclusão, o módulo functools é uma ferramenta poderosa na biblioteca padrão do Python que fornece um conjunto de funções de alta ordem e operações em objetos chamáveis. Ao entender e usar functools, você pode escrever código Python mais eficiente e limpo. Se você é um iniciante começando a aprender Python ou um desenvolvedor experiente procurando melhorar suas habilidades, functools é um módulo que vale a pena explorar.

Parte 4: Novos recursos em functools Python 3.10

O Python 3.10 introduziu alguns novos recursos no módulo functools, melhorando suas capacidades e tornando-o ainda mais poderoso.

Um dos novos recursos é a função functools.cache(). Esta função é uma substituição mais simples e eficiente para functools.lru_cache(). Ela cria um cache que armazena os resultados das chamadas de função, de modo que quando a função é chamada novamente com os mesmos argumentos, o resultado pode ser retornado do cache em vez de ser recalculado. Isso pode acelerar significativamente a execução de funções que são chamadas repetidamente com os mesmos argumentos.

Aqui está um exemplo de como usar functools.cache():

from functools import cache
 
@cache
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)
 
print(fibonacci(10))  # Saída: 55

Neste exemplo, cache() é usado como um decorador para a função fibonacci(). Esta função calcula o enésimo número de Fibonacci e é chamada recursivamente. Ao usar cache(), os resultados das chamadas anteriores são armazenados, para que possam ser reutilizados em chamadas posteriores. Isso acelera significativamente o cálculo dos números de Fibonacci.

Parte 5: functools em Aplicações do Mundo Real

O módulo functools não é apenas um conceito teórico, mas tem usos práticos em aplicações do mundo real. É usado em uma variedade de áreas, desde ciência de dados e aprendizado de máquina até desenvolvimento web e automação.

Na ciência de dados e aprendizado de máquina, functools pode ser usado para criar pipelines de processamento de dados complexos. Por exemplo, você pode usar functools.partial() para criar funções que pré-processam dados de uma determinada maneira e, em seguida, combinar essas funções usando functools.reduce() para criar um pipeline que processa dados em etapas múltiplas.

No desenvolvimento web, functools pode ser usado para criar middleware e decoradores. Por exemplo, você pode usar functools.wraps() para criar decoradores que adicionam comportamento aos manipuladores de solicitação web, como autenticação e registro de log.

Na automação, functools pode ser usado para criar tarefas compostas por várias etapas. Por exemplo, você pode usar functools.partial() para criar tarefas que realizam uma determinada ação com um conjunto específico de parâmetros e, em seguida, usar functools.reduce() para combinar essas tarefas em um fluxo de trabalho.

Conclusão

Em conclusão, o módulo functools é uma ferramenta poderosa na biblioteca padrão do Python que fornece um conjunto de funções de alta ordem e operações em objetos chamáveis. Ao entender e usar functools, você pode escrever código Python mais eficiente e limpo. Se você é um iniciante começando a aprender Python ou um desenvolvedor experiente procurando melhorar suas habilidades, functools é um módulo que vale a pena explorar.


Perguntas Frequentes

O que é o módulo functools em Python?

O módulo functools é uma parte da biblioteca padrão do Python que fornece funções de alta ordem e operações em objetos chamáveis. Ele inclui funções como reduce(), partial() e wraps() que podem ser usadas para manipular e combinar outras funções.

Como a função partial() funciona no módulo functools do Python?

A função partial() no módulo functools do Python permite fixar um certo número de argumentos de uma função e gerar uma nova função. Isso pode ser particularmente útil quando você deseja "lembrar" certos argumentos de uma função.

Qual é o propósito da função wraps() no módulo functools do Python?

A função wraps() no módulo functools do Python é um decorador que é usado para indicar que uma função envolve outra função. Isso é útil quando você usa decoradores, pois mantém os metadados da função original.