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.

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
# 4

range(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.

ChamadaNúmeros geradosLeitura em voz alta
range(5)0, 1, 2, 3, 4cinco números a partir do 0
range(1, 6)1, 2, 3, 4, 5do 1 até antes do 6
range(2, 11, 2)2, 4, 6, 8, 10do 2 até antes do 11, pulando de 2 em 2
range(10, 0, -1)10, 9, 8, ..., 1do 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.