Módulo 9 - Repetições com for e range()
Usando o range(): início, fim e passo
10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Usar as três formas do range(): só fim, início e fim, e início, fim e passo.
- Internalizar a regra do fim exclusivo: o último número nunca entra.
- Gerar sequências que pulam de 2 em 2, de 5 em 5 ou de qualquer passo.
- Contar de trás para frente com passo negativo.
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: Usando o range(): início, fim e passo.
Os objetivos desta aula. Usar as três formas do range(): só fim, início e fim, e início, fim e passo. Internalizar a regra do fim exclusivo: o último número nunca entra. Gerar sequências que pulam de 2 em 2, de 5 em 5 ou de qualquer passo. Contar de trás para frente com passo negativo.
Veja o essencial, parte por parte.
As três formas do range(). range(5) gera 0, 1, 2, 3, 4: começa do zero e o fim NUNCA entra na sequência.
A pegadinha do fim exclusivo, de frente. Escrever range(1, 10) querendo de 1 a 10: sai de 1 a 9. Fim exclusivo pede range(1, 11).
Passo: pulando números e contando de trás para frente. Leia range(a, b, c) sempre assim: começa em a, para ANTES de b, andando de c em c.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
As três formas do range()
Na aula passada o range() apareceu de carona; agora ele é o assunto. O range() é uma função que fabrica sequências de números inteiros, feitas sob medida para alimentar o for. Você diz onde começa, onde para e de quanto em quanto anda, e ele entrega os números um a um, sem ocupar memória com uma lista gigante. A forma mais simples recebe um único valor: o fim.
for i in range(5):
print(i)
# 0
# 1
# 2
# 3
# 4range(5): cinco números, começando do 0. O 5, que dá nome ao range, não aparece.
Duas surpresas para quem vê isso pela primeira vez. A primeira: a contagem começa do zero, não do um. Computação conta do zero por herança de como a memória funciona, e o Python segue a tradição. A segunda: o 5 não apareceu. O valor que você passa é o fim exclusivo, o muro onde a sequência para sem tocar. As duas surpresas juntas têm um lado bom: range(5) produz exatamente 5 números, então repetir 5 vezes é range(5), sem conta mental.
| Chamada | Números gerados | Leitura em voz alta |
|---|---|---|
| range(5) | 0, 1, 2, 3, 4 | cinco números a partir do 0 |
| range(1, 6) | 1, 2, 3, 4, 5 | do 1 até antes do 6 |
| range(2, 11, 2) | 2, 4, 6, 8, 10 | do 2 até antes do 11, pulando de 2 em 2 |
| range(10, 0, -1) | 10, 9, 8, ..., 1 | do 10 até antes do 0, descendo de 1 em 1 |
As formas do range() lado a lado. Em todas, o segundo valor é o muro: a sequência para antes dele.
A pegadinha do fim exclusivo, de frente
O fim exclusivo é, de longe, a maior fonte de erro com range() em provas e em código de iniciante. Você quer os números de 1 a 10, escreve range(1, 10) e recebe de 1 a 9. O programa roda sem nenhuma mensagem de erro, só produz um resultado errado, e erro silencioso é o pior tipo de erro. A regra prática para nunca mais cair: quando quiser INCLUIR o último número, escreva o fim como esse número mais um.
# Quero os números de 1 a 10, INCLUINDO o 10
for i in range(1, 11):
print(i)
# 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 (um por linha)Para incluir o 10, o fim é 11. Parece estranho na primeira semana; vira reflexo na segunda.
Existe um jeito rápido de conferir uma sequência sem montar um loop: pedir para o Python transformar o range em lista com list() e imprimir. Use no Playground sempre que bater dúvida sobre quais números um range produz. É o equivalente a acender a luz do quarto em vez de andar no escuro.
print(list(range(5))) # [0, 1, 2, 3, 4]
print(list(range(1, 6))) # [1, 2, 3, 4, 5]
print(list(range(3, 10, 3))) # [3, 6, 9]O truque do list(): enxergue a sequência inteira antes de usá-la no for. Listas são o assunto do módulo 10.
Passo: pulando números e contando de trás para frente
O terceiro valor do range() é o passo: o tamanho do pulo entre um número e o seguinte. O padrão é 1, mas você pode pedir de 2 em 2 para pegar só os pares, de 5 em 5 para uma escala, de 100 em 100 para o que precisar. E o passo aceita valor negativo, o que destrava um truque útil: contagem regressiva. Com passo negativo, o início precisa ser MAIOR que o fim, porque a sequência desce.
print("Lançamento em:")
for segundos in range(10, 0, -1):
print(segundos)
print("Já!")
# Lançamento em:
# 10
# 9
# ... (até 1)
# Já!range(10, 0, -1): começa no 10, desce de 1 em 1 e para antes do 0. O fim exclusivo vale na descida também.
Repare que a regra do fim exclusivo não mudou de lado: o 0 é o muro e fica de fora, então a contagem termina no 1. Se quisesse terminar no 0, o fim seria -1. Um range que não faz sentido, como range(0, 10, -1), que pede para descer a partir do zero em direção ao dez, não gera erro: gera uma sequência vazia, e o for simplesmente não executa nenhuma volta. De novo o erro silencioso, e de novo o list() como lanterna.
Teste rápido
Quais números o for i in range(3, 8) coloca na variável i, volta a volta?
Perguntas frequentes
- Por que o range() não inclui o último número? Não seria mais intuitivo incluir?
- A escolha tem motivos práticos: com fim exclusivo, range(n) produz exatamente n números, e dois ranges emendados (range(0, 5) e range(5, 10)) cobrem tudo sem repetir o 5. Quase todas as linguagens modernas contam assim. Estranha na primeira semana e depois passa a fazer sentido.
- O range() aceita números decimais, como range(0, 1, 0.1)?
- Não. O range() trabalha só com inteiros, e passar um float gera TypeError. Para sequências decimais existe outro caminho mais adiante na trilha (a função arange da biblioteca NumPy, por exemplo). No nível deste curso, um truque comum é gerar inteiros e dividir dentro do loop.
- range(0) e range(5, 5) fazem o quê?
- Os dois geram sequências vazias, e um for alimentado por eles não executa nenhuma volta. Não é erro: o Python entende que não há números entre o início e o fim. É o mesmo que acontece com um passo na direção errada, como range(0, 10, -1).
- Por que print(range(5)) mostra range(0, 5) em vez dos números?
- Porque o range é preguiçoso de propósito: ele não cria os números de uma vez, entrega um por volta quando o for pede. Isso economiza memória (range(10000000) não pesa quase nada). Para enxergar os números, converta com list(range(5)).
- Qual a diferença entre range(5) e range(0, 5)?
- Nenhuma no resultado: as duas formas geram 0, 1, 2, 3 e 4. Quando você passa um valor só, o Python assume início 0 e passo 1. Escrever range(5) é só a versão curta, e é a mais usada quando o objetivo é repetir 5 vezes.
- Preciso decorar as três formas do range()?
- Não precisa decorar, precisa usar. A leitura em voz alta resolve: começa em a, para antes de b, andando de c em c. Depois de escrever meia dúzia de loops nas próximas aulas, as três formas grudam sozinhas. E a documentação oficial existe para ser consultada sem culpa.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.