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

    Ícone de compressão de arquivos ZIP
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    ZipInfo.compress_level: controle a compressão ZIP

    Aprenda ZipInfo.compress_level no Python para definir níveis de compressão por arquivo e equilibrar tamanho, CPU e compatibilidade.

    Ler mais

    Tempo de leitura: 5 minutos
    24/10/2026
    Código binário representando bytearray.resize no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    bytearray.resize: redimensione buffers com segurança

    Aprenda bytearray.resize no Python para expandir e reduzir buffers com segurança, limites e compatibilidade.

    Ler mais

    Tempo de leitura: 5 minutos
    24/10/2026
    Código Python em notebook para filtrar valores None
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    operator.is_none: filtre None sem perder falsy

    Aprenda operator.is_none e is_not_none para filtrar None sem remover valores falsy válidos no Python.

    Ler mais

    Tempo de leitura: 4 minutos
    23/10/2026
    Código Python em um notebook para criar dataclasses dinâmicas
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    make_dataclass decorator: transforme dataclasses

    Aprenda a usar o parâmetro decorator de make_dataclass para validar, registrar e transformar dataclasses dinâmicas no Python.

    Ler mais

    Tempo de leitura: 6 minutos
    23/10/2026
    Estrutura de código e XML para canonicalização com Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    ElementTree canonicalize: normalize XML no Python

    Aprenda ElementTree canonicalize no Python para comparar XML, gerar hashes estáveis e controlar namespaces, espaços e comentários.

    Ler mais

    Tempo de leitura: 5 minutos
    22/10/2026
    Código de programação Python em uma tela
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    T-strings e templatelib: interpolação estruturada

    Aprenda t-strings e string.templatelib no Python para processar interpolações, criar renderizadores seguros e preservar dados estruturados.

    Ler mais

    Tempo de leitura: 6 minutos
    22/10/2026