itertools.accumulate: somas e estados cumulativos

Publicado em: 30/08/2026
Tempo de leitura: 3 minutos
High-angle view of woman coding on a laptop, with a Python book nearby. Ideal for programming and tech content.

itertools.accumulate() produz resultados acumulados enquanto percorre um iterável. Por padrão, ele calcula somas progressivas, mas também aceita qualquer função binária adequada, como multiplicação, máximo, mínimo ou uma regra de estado personalizada. Como retorna um iterador, funciona bem em pipelines e fluxos de dados grandes.

Neste guia, você verá somas cumulativas, o parâmetro initial, funções de operator, saldos, máximos progressivos, médias acumuladas e cuidados com tipos mutáveis.

Soma acumulada

from itertools import accumulate

valores = [10, 5, -2, 8]
print(list(accumulate(valores)))
# [10, 15, 13, 21]

Cada resultado combina o acumulado anterior com o próximo item.

Valor inicial

print(list(accumulate([5, 7, 3], initial=100)))
# [100, 105, 112, 115]

Com initial, o primeiro elemento emitido é o valor inicial. Isso é útil para saldos, posições e estados que começam antes do primeiro evento.

Multiplicação acumulada

from operator import mul

fatores = [2, 3, 4]
print(list(accumulate(fatores, mul)))
# [2, 6, 24]

Máximo progressivo

temperaturas = [18, 20, 19, 24, 22]
recordes = accumulate(temperaturas, max)
print(list(recordes))
# [18, 20, 20, 24, 24]

Esse padrão encontra o maior valor observado até cada posição.

Saldos após transações

movimentos = [200, -50, -25, 100]
saldos = accumulate(movimentos, initial=1000)
for saldo in saldos:
    print(saldo)

O resultado inclui o saldo inicial e cada estado posterior.

Função personalizada

def limitar(acumulado, valor):
    return max(0, acumulado + valor)

print(list(accumulate([-3, 8, -20, 5], limitar, initial=10)))

A função recebe o acumulado atual e o novo item. Ela deve retornar o próximo estado.

Iteração preguiçosa

accumulate não cria todos os resultados antecipadamente. Você pode combinar o iterador com islice, filtros e outras ferramentas de itertools.

from itertools import accumulate, islice

primeiros = islice(accumulate(gerar_eventos(), atualizar_estado), 100)

Média acumulada

Para médias, acumule soma e quantidade em uma tupla.

def atualizar(estado, valor):
    soma, quantidade = estado
    return soma + valor, quantidade + 1

estados = accumulate([10, 20, 15], atualizar, initial=(0, 0))
medias = [soma / n for soma, n in estados if n]

Estados imutáveis são mais seguros

Evite modificar e devolver o mesmo dicionário ou lista a cada passo, pois todos os resultados podem apontar para o mesmo objeto. Prefira tuplas, dataclasses imutáveis ou cópias explícitas.

accumulate versus sum

sum entrega apenas o total final. accumulate entrega cada estado intermediário. Use-o quando a trajetória for importante.

accumulate versus reduce

functools.reduce também combina itens, mas retorna apenas um resultado final. accumulate expõe a sequência completa dos acumulados.

Precisão numérica

Somas de muitos floats podem acumular erro de arredondamento. Para dinheiro ou precisão decimal, considere decimal.Decimal. Para uma soma final mais precisa de floats, math.fsum pode ser melhor, embora não produza estados intermediários.

Erros comuns

  • Esquecer que initial adiciona um elemento ao resultado.
  • Usar uma função com argumentos na ordem errada.
  • Modificar o mesmo acumulador mutável.
  • Converter um fluxo infinito inteiro em lista.
  • Esperar que o resultado seja um valor, e não um iterador.

Boas práticas

Mantenha a função acumuladora pura, use estados pequenos e imutáveis, documente o significado de initial e consuma o iterador progressivamente. Leia também os guias internos sobre itertools no Python, groupby e pairwise.

Conclusão

itertools.accumulate é ideal para totais progressivos e máquinas de estado simples. Sua natureza preguiçosa permite processar grandes fluxos, enquanto funções personalizadas tornam a ferramenta útil muito além de somas.

Fontes externas

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    A person reads 'Python for Unix and Linux System Administration' indoors.
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    itertools.groupby: agrupe dados ordenados corretamente

    Aprenda itertools.groupby no Python para agrupar dados ordenados, agregar streams e evitar erros com subiteradores compartilhados.

    Ler mais

    Tempo de leitura: 3 minutos
    30/08/2026
    High-angle view of woman coding on a laptop, with a Python book nearby. Ideal for programming and tech content.
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    contextlib.chdir: riscos ao trocar diretórios

    Aprenda contextlib.chdir no Python, seus riscos com estado global e concorrência e quando preferir pathlib ou subprocess cwd.

    Ler mais

    Tempo de leitura: 3 minutos
    30/08/2026
    A person typing on a laptop with a Python programming book visible, capturing technology and learning.
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    nullcontext no Python: contextos opcionais

    Use nullcontext no Python para unificar contextos opcionais, recursos já abertos, locks e transações sem duplicar código.

    Ler mais

    Tempo de leitura: 5 minutos
    30/08/2026
    Close-up view of a computer screen displaying code in a software development environment.
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    contextlib.aclosing: feche geradores async

    Aprenda contextlib.aclosing no Python para fechar geradores assíncronos em break, return, exceções e cancelamentos com segurança.

    Ler mais

    Tempo de leitura: 5 minutos
    30/08/2026
    A developer typing code on a laptop with a Python book beside in an office.
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    weakref.finalize: limpeza automática sem reter objetos

    Aprenda weakref.finalize no Python para limpar recursos sem manter objetos vivos, usando close, detach, alive e callbacks seguros.

    Ler mais

    Tempo de leitura: 6 minutos
    30/08/2026
    A developer typing code on a laptop with a Python book beside in an office.
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    SimpleNamespace: objetos leves com atributos

    Aprenda SimpleNamespace no Python para criar objetos leves por atributos, converter dicionários e escolher entre dataclass e TypedDict.

    Ler mais

    Tempo de leitura: 5 minutos
    29/08/2026