0Pricing
Python Academy · Aula

functools: partial e reduce

Crie funções especializadas com partial e reduza sequências com reduce.

functools: partial e reduce é uma aula grátis de Python Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Python Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Python Academy inclui 4 aulas no total.

Visão geral de functools

functools é um módulo da biblioteca padrão com funções de ordem superior que operam sobre outras funções ou as retornam.

import functools

# partial, reduce, lru_cache, wraps, cached_property ...
print(dir(functools))

partial()

functools.partial(func, *args, **kw) cria um novo objeto chamável com alguns argumentos preenchidos previamente.

import functools

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

square = functools.partial(power, exp=2)
cube   = functools.partial(power, exp=3)

print(square(4))  # 16
print(cube(3))    # 27

partial com métodos

Use partial para adaptar métodos com parâmetros fixos e utilizá-los como funções de retorno ou manipuladores de eventos.

import functools, logging

logger = logging.getLogger("app")
log_error = functools.partial(logger.log, logging.ERROR)

log_error("Something went wrong")

partial versus lambda

partial é preferível a lambda para preencher argumentos previamente, pois pode ser serializado com pickle, tem uma representação útil e preserva a docstring.

import functools

mul = lambda x, y: x * y

double_lambda = lambda x: mul(x, 2)            # lambda approach
double_partial = functools.partial(mul, y=2)   # partial approach

print(double_partial(5))   # 10

reduce()

functools.reduce(func, iterable, initial) reduz o iterável da esquerda para a direita usando uma função binária.

import functools, operator

total = functools.reduce(operator.add, [1,2,3,4,5])
print(total)   # 15

product = functools.reduce(operator.mul, [1,2,3,4,5], 1)
print(product) # 120

Construindo max() com reduce

Ilustre reduce reimplementando max():

import functools

def my_max(seq):
    return functools.reduce(lambda a, b: a if a > b else b, seq)

print(my_max([3, 1, 4, 1, 5, 9]))  # 9

Achatar listas aninhadas

Use reduce com operator.iconcat para achatar um nível de aninhamento.

import functools, operator

nested = [[1,2],[3,4],[5]]
flat = functools.reduce(operator.iconcat, nested, [])
print(flat)  # [1, 2, 3, 4, 5]

partial para construir URLs

Um padrão prático com partial: fixe uma URL base e crie auxiliares especializados para requisições.

import functools, urllib.request

def fetch(base, path):
    url = base.rstrip("/") + "/" + path.lstrip("/")
    with urllib.request.urlopen(url) as r:
        return r.read()

github = functools.partial(fetch, "https://api.github.com")
# github("/users/octocat")

wraps(): preservando metadados

Ao escrever decoradores, use @functools.wraps(wrapped) para que o wrapper preserve o nome e a docstring da função original.

import functools

def decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        return func(*args, **kw)
    return wrapper

@decorator
def greet(name):
    """Say hello."""
    return f"Hello, {name}"

print(greet.__name__)  # greet
print(greet.__doc__)   # Say hello.

total_ordering

@functools.total_ordering preenche os métodos de comparação ausentes quando você define __eq__ e um de __lt__/__le__/__gt__/__ge__.

import functools

@functools.total_ordering
class Version:
    def __init__(self, major, minor):
        self.v = (major, minor)
    def __eq__(self, o): return self.v == o.v
    def __lt__(self, o): return self.v < o.v

print(Version(1,2) >= Version(1,1))  # True

singledispatch

@functools.singledispatch cria uma função que encaminha a execução para diferentes implementações com base no tipo do primeiro argumento.

import functools

@functools.singledispatch
def process(arg):
    raise NotImplementedError(type(arg))

@process.register(int)
def _(n): return n * 2

@process.register(str)
def _(s): return s.upper()

print(process(5))     # 10
print(process("hi"))  # HI

Verificação rápida

O que functools.partial(pow, 2) cria?

Recapitulação

partial preenche previamente os argumentos de uma função; reduce reduz uma sequência com uma função binária; wraps preserva os metadados do decorador; total_ordering preenche os métodos de comparação; singledispatch encaminha a execução com base no tipo.

Perguntas Frequentes

A aula “functools: partial e reduce” é grátis?

Sim — o texto completo de “functools: partial e reduce” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Python Academy, atualize para CoddyKit PRO. O curso de Python Academy inclui 4 aulas no total.

O que vou aprender em “functools: partial e reduce”?

Crie funções especializadas com partial e reduza sequências com reduce. Você pratica Python Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Python Academy?

Nenhuma experiência prévia é necessária. Python Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “functools: partial e reduce”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Python Academy?

Sim. Cada aula de Python Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. itertools: iteradores infinitos e finitos
  2. itertools: combinatória
  3. functools: partial e reduce
  4. functools: lru_cache e cached_property
← Voltar para Python Academy