Módulo 13 - Geradores e iteradores
O que é um iterável
10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Distinguir um iterável de um iterador no Python.
- Usar iter() e next() para percorrer uma sequência na mão.
- Entender o StopIteration como sinal de fim de iteração.
- Reconhecer que o for esconde esse protocolo para você.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: O que é um iterável.
Os objetivos desta aula. Distinguir um iterável de um iterador no Python. Usar iter() e next() para percorrer uma sequência na mão. Entender o StopIteration como sinal de fim de iteração. Reconhecer que o for esconde esse protocolo para você.
Veja o essencial, parte por parte.
O que o for percorre de verdade. Um iterável é qualquer coisa que o for consegue percorrer: lista, tupla, string, dicionário, conjunto.
StopIteration, o fim de linha. E quando os itens acabam?
Fixando a ideia. Todo iterador também é um iterável: iter() sobre um iterador devolve ele mesmo.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
O que o for percorre de verdade
Desde o Básico você escreve for item in lista sem pensar no que acontece por dentro. Está na hora de abrir essa caixa, porque entender o mecanismo é o que permite criar as suas próprias sequências no restante deste módulo. A ideia central é simples: o for não sabe nada sobre listas em particular. Ele conhece um protocolo, um acordo, que qualquer objeto pode cumprir. Quem cumpre esse acordo é percorrível pelo for. Cumprir o acordo significa duas coisas: saber entregar um iterador quando alguém chama iter(), e esse iterador saber entregar o próximo item quando alguém chama next().
Vale separar dois nomes que parecem iguais e não são. O iterável é a coleção, a fonte: a lista [1, 2, 3]. O iterador é o caminhante que anda por ela, guardando onde parou. Uma lista sozinha não guarda posição; você pode percorrê-la duas vezes do começo. O iterador, sim, guarda posição: depois que ele entrega o último item, acabou para ele. Essa distinção fica clara quando você faz o trabalho do for na mão, como no exemplo a seguir.
numeros = [10, 20, 30]
andarilho = iter(numeros) # pede um iterador para a lista
print(type(andarilho)) # <class 'list_iterator'>
print(next(andarilho)) # 10
print(next(andarilho)) # 20
print(next(andarilho)) # 30iter() devolve o iterador; cada next() entrega o próximo item, na ordem.
StopIteration, o fim de linha
E quando os itens acabam? O iterador precisa avisar de algum jeito que não há próximo. Em vez de devolver um valor especial, que poderia se confundir com um dado real, ele levanta uma exceção chamada StopIteration. É um sinal, não um erro de verdade a se preocupar. O for está o tempo todo esperando por esse sinal: quando ele chega, o laço termina de forma limpa, sem que você precise contar itens nem verificar tamanho.
letras = iter("oi")
print(next(letras)) # o
print(next(letras)) # i
print(next(letras)) # levanta StopIteration
# Traceback (most recent call last):
# ...
# StopIterationDepois do último item, next() levanta StopIteration para dizer que acabou.
Agora dá para enxergar o for como açúcar sintático em cima desse protocolo. Escrever for x in fonte é o mesmo que, nos bastidores, pegar um iterador com iter(fonte), chamar next() dentro de um laço, guardar cada valor em x e parar quando o StopIteration aparece. Você nunca precisa escrever isso na mão no dia a dia, e é bom que seja assim. Mas conhecer o mecanismo muda tudo, porque no próximo passo você vai construir objetos que produzem itens sob demanda, cumprindo exatamente esse acordo, com uma palavra nova chamada yield.
Iterável (a coleção)
- É a fonte dos dados: lista, string, dicionário
- Responde a iter() entregando um iterador
- Pode ser percorrido de novo, do começo
- Não guarda em que ponto você está
Iterador (o caminhante)
- É quem anda item por item pela fonte
- Responde a next() com o próximo valor
- Se esgota: depois do fim, só StopIteration
- Guarda a posição atual da caminhada
Fixando a ideia
Antes de seguir, vale amarrar o conceito. Um iterável entrega um iterador quando você chama iter(). O iterador entrega itens quando você chama next(), um de cada vez, e levanta StopIteration ao terminar. O for orquestra isso tudo por você. Guardar essa sequência de eventos é o que faz a próxima aula, sobre funções geradoras, cair como uma luva, porque o gerador é justamente um jeito prático de criar um iterador sem escrever nenhuma dessas peças na mão.
Teste rápido
Qual é o papel do StopIteration no protocolo de iteração?
Perguntas frequentes
- Qual a diferença entre iterável e iterador?
- O iterável é a coleção, a fonte, como uma lista ou string; ele responde a iter(). O iterador é o objeto que caminha por essa fonte item por item, respondendo a next() e guardando onde parou. Toda lista é iterável, mas quem de fato anda por ela é o iterador que iter() devolve.
- Preciso usar iter() e next() no dia a dia?
- Quase nunca de forma direta, porque o for faz isso por você. Conhecer o protocolo serve para entender geradores, o assunto do módulo, e para casos específicos, como consumir um iterador aos poucos ou usar next() com valor padrão. É conhecimento de mecanismo, não de rotina.
- StopIteration é um erro de verdade?
- Tecnicamente é uma exceção, mas o seu papel é ser um sinal de controle, não uma falha. O for a captura em silêncio para saber quando parar. Você só a vê no traceback se chamar next() na mão depois que os itens acabaram, o que serve justamente para ilustrar o mecanismo.
- Um dicionário é iterável? O que o for percorre nele?
- Sim, o dicionário é iterável. Ao percorrê-lo com um for simples, você caminha pelas chaves. Para percorrer valores use .values() e para pares use .items(). Todos esses são iteráveis que entregam iteradores quando o for pede.
- Posso percorrer o mesmo iterador duas vezes?
- Não do começo. Um iterador se esgota: depois de entregar o último item, novas chamadas a next() só levantam StopIteration. Para percorrer de novo, peça um iterador novo com iter() sobre o iterável original. A lista pode ser reaproveitada; o iterador dela, não.
- Como o for sabe a hora de parar?
- Ele repete next() sobre o iterador e fica atento ao StopIteration. Assim que essa exceção aparece, o for entende que a sequência acabou e encerra o laço. Por isso você nunca precisa verificar o tamanho da coleção dentro de um for: o protocolo cuida disso.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.