Como usar a função enumerate em Python

Última atualização
30 dez 2025
Tempo de leitura
7 min
Como usar a função enumerate em Python

Neste guia, você verá o que a função enumerate faz, quando usá-la na prática, como funciona sua sintaxe, exemplos comuns de uso e os principais erros que devem ser evitados.

Python para Análise de Dados

Economize R$320 na compra do seu curso. Use o código copied blog2025 e comece a aprender!

Aprenda uma das linguagens de programação mais versáteis e acessíveis da área de analytics e manuseie, de forma automatizada, grandes quantidades de dados. Com esta ferramenta poderosa você irá agilizar seu trabalho, integrar seus sistemas e processar dados mais rapidamente e em diferentes formatos.

2 meses
12x de
R$ 145,00
(parcelas sem juros no cartão de crédito)
Investimento pelo curso completo
R$ 1.740
R$ 2.900
Inscreva-se no curso

A função enumerate é uma das formas mais simples e idiomáticas de obter, ao mesmo tempo, o item de um iterável e a sua posição durante um laço for . Ela elimina a necessidade de contadores manuais e evita o uso excessivo de range(len(...)) , tornando o código mais legível e menos propenso a erros.

O que faz a função enumerate em Python?

A função enumerate(iterável, start=0) cria um iterador que retorna pares no formato (índice, item) a cada iteração. Esse índice é gerado automaticamente e começa, por padrão, em zero.

frutas = ["maçã", "banana", "uva"]

for i, fruta in enumerate(frutas):

print(i, fruta)

Saída:
0 maçã
1 banana
2 uva

Na prática, enumerate funciona como um contador acoplado ao laço, sincronizado com o iterável. O Python cuida da contagem e da associação entre posição e valor.

Para que serve a função enumerate na prática

O uso de enumerate é indicado sempre que a lógica do laço depende tanto do valor quanto da sua posição. Isso ocorre com frequência em tarefas simples do dia a dia.

Um exemplo comum é numerar linhas de um arquivo ou saída para usuários, usando contagem iniciada em 1:

for linha, texto in enumerate(arquivo, start=1):

print(f"{linha:>4}: {texto.rstrip()}")

 

Outro uso recorrente é atualizar uma lista “no lugar”, sem recorrer a range(len(...)) :

nums = [10, 20, 30]
for i, n in enumerate(nums):
nums[i] = n * 2
# [20, 40, 60]

 

Também é útil para gerar rótulos que dependem da posição:

etiquetas = [f"{i}: {v}" for i, v in enumerate(["A", "B", "C"], start=1)]
# ['1: A', '2: B', '3: C']

 

E para iterar dicionários mantendo um contador explícito:

precos = {"arroz": 22.9, "feijão": 8.5, "óleo": 6.7}

for i, (produto, valor) in enumerate(precos.items(), start=1):

print(i, produto, valor)

 

Em quais tipos de iteráveis funciona

A função enumerate funciona com qualquer objeto iterável, incluindo listas, tuplas, strings, range , arquivos, geradores e métodos como dict.items() .

Algumas observações importantes ajudam a evitar confusão:

  • Em dicionários, use .items() se precisar acessar chave e valor juntos.
  • Em conjuntos ( set ), a enumeração funciona, mas a ordem não é garantida.
  • Em arquivos, enumerate é especialmente eficiente, pois o iterador é preguiçoso e não carrega tudo em memória.

Quando evita código verboso

Um dos maiores benefícios do enumerate é substituir padrões mais longos e frágeis.

Em vez de:

# Verboso, sujeito a off-by-one e repetição de indexação

for i in range(len(seq)):

valor = seq[i]

...

Prefira:

for i, valor in enumerate(seq):

...

Esse padrão é mais legível, reduz erros de índice e funciona até mesmo com iteráveis que não suportam indexação direta.

Quando a contagem precisa ser “humana”, basta definir o ponto inicial:

 

for valor in seq: ou for _, valor in enumerate(seq): (melhor ainda, sem enumerate ).

  • Com dicionários, pegue chave e valor:
    for i, (k, v) in enumerate(meu_dict.items(), 1): ...
  • Evite mudar o tamanho da lista durante a iteração. Atualizar “no lugar” (reatribuir seq[i] ) é ok; inserir/remover não.

Sintaxe, parâmetros e retorno

A assinatura da função é simples:

enumerate(iterável, start=0)

O primeiro parâmetro é qualquer iterável. O segundo, opcional, define o valor inicial do índice.

O retorno é um objeto do tipo enumerate , que é um iterador. Isso significa que ele é consumido durante a iteração e não pode ser reutilizado sem ser recriado.

Exemplos rápidos

list(enumerate("abc"))
# [(0, 'a'), (1, 'b'), (2, 'c')]

list(enumerate(range(3), start=10))
# [(10, 0), (11, 1), (12, 2)]

Quando usar enumerate

Use enumerate quando a posição do item é relevante para a lógica do código. Isso inclui numeração de saídas, atualização de listas, geração de mensagens de erro com contexto ou interrupção do laço ao encontrar uma condição específica.

for i, v in enumerate(valores, start=1):

if v > 100:

print(f"Primeiro acima de 100: posição {i}, valor {v}")

break

Evite enumerate quando o índice não é usado. Nesses casos, um for simples é mais claro. Também tenha cautela ao usá-lo com estruturas sem ordem previsível, como set.

Exemplos práticos com enumerate

Numeração de linhas de um arquivo com contagem humana (começando em 1):

with open("logs.txt", encoding="utf-8") as f:

for linha, texto in enumerate(f, start=1):

print(f"{linha:>4}: {texto.rstrip()}")

Atualização “no lugar” sem range(len(...)) :

notas = [7.5, 8.0, 6.0]

for i, n in enumerate(notas):

notas[i] = min(n + 0.5, 10.0)

print(notas) # [8.0, 8.5, 6.5]

Encontrar a primeira ocorrência que atende a uma condição e capturar a posição:

valores = [12, 5, 3, 27, 9]

posicao_primeiro_maior_10 = None

 

for i, v in enumerate(valores):

if v > 10:

posicao_primeiro_maior_10 = i

break

print(posicao_primeiro_maior_10) # 0

# (Alternativa concisa: next((i for i, v in enumerate(valores) if v > 10), None))

Rotular itens com posição em relatórios e interfaces:

opcoes = ["Básico", "Padrão", "Premium"]

rotulos = [f"{i}. {nome}" for i, nome in enumerate(opcoes, start=1)]

print(rotulos) # ['1. Básico', '2. Padrão', '3. Premium']

Iterar dicionários preservando a ordem de iteração e exibindo um contador:

precos = {"arroz": 22.9, "feijão": 8.5, "óleo": 6.7}

for i, (produto, valor) in enumerate(precos.items(), start=1):

print(f"{i} — {produto}: R$ {valor:.2f}")

Sincronizar índice com múltiplas coleções (útil em logs e validações):

usuarios = ["Ana", "Bruno", "Clara"]

perfis = ["admin", "editor", "viewer"]

ativos = [True, False, True]

 

for i, (u, p, a) in enumerate(zip(usuarios, perfis, ativos), start=1):

status = "ativo" if a else "inativo"

print(f"{i:02d} | {u:<5} | {p:<6} | {status}")

Filtrar por posição (pares/ímpares) sem criar índices manualmente:

dados = ["a", "b", "c", "d", "e"]

pares = [v for i, v in enumerate(dados) if i % 2 == 0] # posições 0,2,4

print(pares) # ['a', 'c', 'e']

Adicionar um campo id sequencial a registros já existentes:

registros = [{"nome": "Ana"}, {"nome": "Bruno"}, {"nome": "Clara"}]

for i, registro in enumerate(registros, start=1):

registro["id"] = i

print(registros)

# [{'nome': 'Ana', 'id': 1}, {'nome': 'Bruno', 'id': 2}, {'nome': 'Clara', 'id': 3}]

Esses padrões cobrem o uso diário de enumerate : leitura clara, menos código cerimonial e índices sempre sincronizados com os itens.

Erros comuns

Alguns erros aparecem com frequência e comprometem a clareza ou a segurança do código.

O mais comum é usar range(len(seq)) sem necessidade, tornando o código mais longo e sujeito a falhas. Outro erro recorrente é esquecer o parâmetro start=1 quando a numeração é exibida para usuários finais.

Também é comum tentar desempacotar chave e valor diretamente ao enumerar um dicionário sem usar .items() , confiar em ordem estável ao enumerar conjuntos ou modificar o tamanho de uma lista durante a iteração.

Além disso, enumerate não deve ser reutilizado após ser consumido, pois se trata de um iterador. E o índice retornado nunca deve ser tratado como identificador persistente.

Conclusão

A função enumerate é a forma idiomática em Python de combinar posição e valor em um mesmo laço. Ela reduz código cerimonial, melhora a legibilidade e diminui erros comuns de indexação. Funciona com qualquer iterável, permite ajustar o ponto inicial da contagem e se integra naturalmente ao estilo da linguagem.

Sempre que a lógica exigir o item e a sua posição, enumerate deve ser a primeira opção. Evite usá-la quando o índice não é necessário e mantenha atenção às estruturas sem ordem garantida. Com esses cuidados, a função se torna uma aliada constante na escrita de código mais limpo e confiável.

Página inicial / Programação & Dados
Equipe EBAC

O conteúdo

Python para Análise de Dados

Economize R$320 na compra do seu curso. Use o código copied blog2025 e comece a aprender!

Aprenda uma das linguagens de programação mais versáteis e acessíveis da área de analytics e manuseie, de forma automatizada, grandes quantidades de dados. Com esta ferramenta poderosa você irá agilizar seu trabalho, integrar seus sistemas e processar dados mais rapidamente e em diferentes formatos.

2 meses
12x de
R$ 145,00
(parcelas sem juros no cartão de crédito)
Investimento pelo curso completo
R$ 1.740
R$ 2.900
Inscreva-se no curso
Cadastre-se Cadastre-se Cadastre-se Cadastre-se Cadastre-se

Artigos Relacionados

26 jan 2026
8 min
O que é o teste de hipóteses

Os testes de hipóteses são ferramentas essenciais para analisar dados de forma objetiva, permitindo verificar se padrões observados refletem efeitos reais ou simples coincidências. Neste artigo, você vai descobrir como os testes de hipóteses funcionam, quais são seus tipos principais e como aplicá-los de forma prática para interpretar resultados de forma confiável.

26 jan 2026
8 min
26 jan 2026
9 min
Estatística descritiva: o que é, tipos e exemplos

A estatística descritiva é a ferramenta que transforma dados brutos em informações compreensíveis, permitindo identificar padrões, diferenças e pontos fora do comum de maneira rápida. Ela fornece uma visão clara do cenário analisado, tornando mais fácil interpretar números e tomar decisões fundamentadas.

26 jan 2026
9 min
31 dez 2025
8 min
Operadores lógicos Javascript: AND e OR

Aprenda quando usar && e ||, como o curto-circuito funciona de verdade, por que esses operadores retornam valores (e não apenas booleanos) e quais padrões evitam bugs em validação, guard clauses e defaults.

31 dez 2025
8 min
30 dez 2025
5 min
Como usar a função join em Python

Neste guia, você vai entender o que é a função join, como funciona sua sintaxe, quando usá-la no dia a dia, exemplos práticos e os erros mais comuns que devem ser evitados.

30 dez 2025
5 min
29 dez 2025
5 min
Como criar um clássico “Hello world!” em JavaScript

Um guia prático para validar seu ambiente, entender onde o JavaScript roda e dar o primeiro passo com exemplos simples e erros comuns explicados.

29 dez 2025
5 min
Kotlin vs Java: Qual é a diferença?

Se você está começando no mundo da programação para Android ou quer entender qual linguagem escolher para os seus projetos, provavelmente já se perguntou: Kotlin ou Java? Ambas são usadas no desenvolvimento para a plataforma Android, mas possuem diferenças importantes que afetam a produtividade, segurança e desempenho. Vamos entender estas diferenças para que você possa tomar a melhor decisão.

05 maio 2025
14 min