✅ Artigo atualizado em Setembro 2026 Novas seções sobre start, stop e step, passo negativo, range vazio, o objeto
range(lazy), range com float,range()vsenumerate(), erros comuns com traceback e 8 exercícios resolvidos.
Resposta rápida
range() gera uma sequência de números inteiros, usada principalmente no for para repetir algo N vezes. A sintaxe é range(início, fim, passo): o início (padrão 0) entra, o fim nunca entra e o passo (padrão 1) pode ser negativo.
1
2
3
list(range(5)) # [0, 1, 2, 3, 4]
list(range(1, 6)) # [1, 2, 3, 4, 5]
list(range(10, 0, -2)) # [10, 8, 6, 4, 2]
Resumo em 30 segundos:
- O fim é exclusivo: para ir de 1 a 5, use
range(1, 6). - Com um argumento só, o
rangecomeça em 0:range(5)é 0 a 4. - Passo negativo faz contagem regressiva:
range(5, 0, -1)gera 5 a 1. - Só aceita inteiros:
range(0.5)dáTypeError, e passo 0 dáValueError. - Retorna um objeto
range, não uma lista: uselist(range(...))para ver os números.
Olá, olá Pythonista!
Vamos tratar de um assunto muito importante nesse post: como construir loops utilizando a função range do Python!
Ainda não está familiarizado com for, while e loops do Python?
Então já acessa nosso post completo sobre Estruturas de Repetição no Python clicando aqui!
Depois, vamos nessa!
Vá Direto ao Assunto…
- A função
range() - Utilizando
range - Como funciona o range em Python: start, stop e step
- range é uma lista? O objeto range e a avaliação lazy
- range() e enumerate(): para que serve cada um
- Erros comuns
- Exercícios resolvidos
A função range()
Essa função é de grande ajuda quando o tema é repetição, laços, for etc.
Ela permite especificar o início de uma sequência, o passo (ou pulo) e o valor final.
Com isso, o Python nos retorna uma sequência de números para que possamos iterar!
Sua sintaxe pode ter as seguintes três formas, sendo que seu único parâmetro obrigatório é o fim:
1
2
3
range(fim) # range(stop)
range(inicio, fim) # range(start, stop)
range(inicio, fim, passo) # range(start, stop, step)
É importante ressaltar que na versão 3.x do Python, a função range() retorna um objeto do tipo range (uma sequência imutável) e não mais uma lista com elementos. Por isso, quando você quiser ver os números ou precisar de uma lista de verdade, converta o retorno com a função list(). A documentação oficial do tipo range descreve todos os detalhes.
Veja alguns exemplos de como criar listas com range:
1
2
3
4
5
6
7
8
# Gerar lista com (fim)
print(list(range(5)))
# Gerar com (inicio, fim)
print(list(range(5, 10)))
# Gerar com (inicio, fim, passo)
print(list(range(0, 10, 2)))
Resultando do código acima:
1
2
3
[0, 1, 2, 3, 4]
[5, 6, 7, 8, 9]
[0, 2, 4, 6, 8]
Está curtindo esse conteúdo? ![]()
Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?
Utilizando range
Sabendo que a estrutura de repetição for executa um ciclo para cada elemento de um iterável, e a função range é um iterável, podemos criar uma harmonia perfeita entre esses dois (se quiser se aprofundar no for, veja nosso post sobre loops com for no Python):
1
2
for num in range(4):
print(num)
O código acima irá imprimir a sequência de 4 itens especificado no range:
1
2
3
4
0
1
2
3
O range não se aplica diretamente ao while, porém um exemplo um pouco mais complexo pode demonstrar eles juntos:
1
2
3
4
5
6
7
8
9
lista = list(range(6))
comprimento = 6
while len(lista) == comprimento:
print(lista)
lista.append('item')
else:
print(f'O comprimento da Lista é {len(lista)} e ultrapassou {comprimento}!')
print(lista)
Saída:
1
2
3
[0, 1, 2, 3, 4, 5]
O comprimento da Lista é 7 e ultrapassou 6!
[0, 1, 2, 3, 4, 5, 'item']
Explicando: basicamente ele verifica se o tamanho da lista é igual a 6 itens. Após a primeira verificação ele adiciona mais um item (item), assim modificando seu comprimento e encerrando o laço!
Como funciona o range em Python: start, stop e step
O range recebe até três inteiros, que na documentação se chamam start, stop e step:
-
start(início): primeiro número gerado. Opcional, padrão0. -
stop(fim): o limite. Obrigatório e nunca incluído no resultado. -
step(passo): quanto somar a cada volta. Opcional, padrão1. Pode ser negativo, mas não pode ser zero.
A tabela abaixo resume as chamadas mais comuns (todas as saídas foram conferidas no Python):
| Chamada | O que gera | list() |
|---|---|---|
range(5) |
5 números a partir do 0 | [0, 1, 2, 3, 4] |
range(1, 6) |
de 1 a 5 (o 6 fica de fora) | [1, 2, 3, 4, 5] |
range(0, 10, 2) |
pares de 0 a 8 | [0, 2, 4, 6, 8] |
range(1, 10, 3) |
de 3 em 3 a partir do 1 | [1, 4, 7] |
range(-3, 3) |
de -3 a 2 | [-3, -2, -1, 0, 1, 2] |
range(5, 0, -1) |
contagem regressiva de 5 a 1 | [5, 4, 3, 2, 1] |
range(10, 0, -3) |
de 10 para baixo, de 3 em 3 | [10, 7, 4, 1] |
range(5, 1) |
nada (início maior que o fim com passo positivo) | [] |
range(0) |
nada | [] |
O fim (stop) nunca é incluído
Essa é a regra que mais derruba iniciante (e que mais cai em prova). O range para antes de chegar no stop. Uma forma prática de pensar: range(início, fim) gera fim - início números.
1
2
3
print(list(range(1, 5))) # 4 números: não inclui o 5
print(list(range(1, 6))) # para incluir o 5, use fim = 6
print(len(range(1, 6))) # 6 - 1 = 5 números
1
2
3
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
5
Por que foi projetado assim? Porque combina com os índices de listas, que começam em 0: range(len(lista)) gera exatamente os índices válidos, de 0 até len(lista) - 1. É a mesma lógica do fatiamento de listas, em que lista[1:4] também exclui o índice 4.
Passo negativo: contagem regressiva
Com step negativo, o range anda para trás. Nesse caso o início precisa ser maior que o fim, e o fim continua exclusivo:
1
2
3
4
5
6
for i in range(5, 0, -1):
print(i)
print(list(range(10, 0, -2))) # para no 2: o 0 é o fim, e não entra
print(list(range(10, -1, -2))) # para incluir o 0, o fim vira -1
print(list(reversed(range(1, 6))))
1
2
3
4
5
6
7
8
5
4
3
2
1
[10, 8, 6, 4, 2]
[10, 8, 6, 4, 2, 0]
[5, 4, 3, 2, 1]
A última linha mostra uma alternativa: reversed(range(1, 6)) percorre o range ao contrário, e às vezes é mais fácil de ler do que acertar o início e o fim com passo negativo.
Quando o range fica vazio
Se o passo não “aponta” na direção do fim, o range fica vazio. O Python não mostra erro: o for simplesmente não executa nenhuma vez.
1
2
3
4
5
6
print(list(range(5, 1))) # passo +1, mas 5 já passou do 1
print(list(range(3, 3))) # início igual ao fim
for i in range(5, 1):
print(i) # nunca executa
print('fim')
1
2
3
[]
[]
fim
Se o seu for “não faz nada”, confira se esqueceu o -1 em uma contagem regressiva.
range com float: não existe (e as alternativas)
O range só aceita inteiros, em qualquer um dos três argumentos. range(0, 1, 0.1) dá erro (veja em Erros comuns). Para gerar números decimais, gere inteiros e divida:
1
2
3
print([i / 10 for i in range(5)]) # 0.0 a 0.4, de 0.1 em 0.1
print([i * 0.1 for i in range(5)]) # cuidado: multiplicar acumula erro de ponto flutuante
print([i / 2 for i in range(5)]) # 0.0 a 2.0, de 0.5 em 0.5
1
2
3
[0.0, 0.1, 0.2, 0.3, 0.4]
[0.0, 0.1, 0.2, 0.30000000000000004, 0.4]
[0.0, 0.5, 1.0, 1.5, 2.0]
Dividir (i / 10) dá resultados mais limpos do que multiplicar por 0.1. Se você já usa NumPy, numpy.arange(0, 1, 0.25) aceita passo decimal e gera [0. 0.25 0.5 0.75]. As expressões entre colchetes acima são list comprehensions, que combinam muito bem com range.
range é uma lista? O objeto range e a avaliação lazy
Não. No Python 3, range() devolve um objeto do tipo range, que não guarda os números: ele guarda só start, stop e step e calcula cada valor quando ele é pedido (avaliação lazy, ou preguiçosa). Por isso print(range(5)) mostra range(0, 5) e não a lista.
1
2
3
4
5
6
7
8
9
10
11
12
r = range(0, 20, 5)
print(r) # o próprio objeto
print(type(r))
print(list(r)) # convertendo para lista
print(len(r)) # quantos números ele gera
print(15 in r) # teste de pertencimento
print(7 in r)
print(r[2]) # índice
print(r[-1]) # índice negativo
print(r[1:3]) # fatiar um range devolve outro range
print(r.start, r.stop, r.step)
1
2
3
4
5
6
7
8
9
10
range(0, 20, 5)
<class 'range'>
[0, 5, 10, 15]
4
True
False
10
15
range(5, 15, 5)
0 20 5
Ou seja, um range se comporta como uma sequência imutável: aceita len(), in, índice, índice negativo e fatiamento, igual a uma lista, mas não aceita append() nem alteração de valores.
A vantagem é memória. O objeto range tem sempre o mesmo tamanho, não importa quantos números ele represente:
1
2
3
4
5
6
import sys
numeros = range(1_000_000)
print(sys.getsizeof(numeros)) # o objeto range
print(sys.getsizeof(list(numeros))) # a lista com 1 milhão de itens
print(999_999 in numeros)
1
2
3
48
8000056
True
Os números acima são bytes, medidos no CPython 3.10 de 64 bits (o valor da lista conta só a estrutura da lista, sem os inteiros em si). Além disso, in em um range de inteiros é calculado por conta, sem percorrer os itens um a um. Moral: use range direto no for e só converta com list() quando precisar realmente de uma lista.
Saber escolher entre range e enumerate é o tipo de detalhe que fica automático com prática guiada - é assim que a Jornada Python ensina cada fundamento, do básico ao Django:
range() e enumerate(): para que serve cada um
Uma dúvida comum (e pergunta frequente de prova) é quando usar range() e quando usar enumerate():
-
range()gera números. Use para repetir algo N vezes ou para produzir uma sequência numérica. -
enumerate()percorre uma coleção e entrega pares(índice, valor). Use quando você precisa do item e da posição dele.
O padrão range(len(lista)) funciona, mas obriga a acessar lista[i] na mão. O enumerate faz o mesmo de forma mais legível:
1
2
3
4
5
6
7
8
9
10
11
12
13
frutas = ['maçã', 'banana', 'uva']
# Com range(len()): funciona, mas é mais verboso
for i in range(len(frutas)):
print(i, frutas[i])
# Com enumerate: mais idiomático
for i, fruta in enumerate(frutas):
print(i, fruta)
# enumerate também pode começar a contagem em 1
for posicao, fruta in enumerate(frutas, start=1):
print(posicao, fruta)
1
2
3
4
5
6
7
8
9
0 maçã
1 banana
2 uva
0 maçã
1 banana
2 uva
1 maçã
2 banana
3 uva
Tabela de decisão:
| Você quer | Use | Exemplo |
|---|---|---|
| Repetir um bloco N vezes | range(n) |
for _ in range(3): |
| Gerar números com início, fim e passo | range(início, fim, passo) |
range(0, 101, 10) |
| Contagem regressiva |
range com passo negativo |
range(10, 0, -1) |
| Percorrer os itens de uma lista | o próprio for
|
for fruta in frutas: |
| Precisar do item e da posição | enumerate() |
for i, fruta in enumerate(frutas): |
| Alterar a lista pelo índice | range(len(lista)) |
for i in range(len(precos)): precos[i] *= 2 |
Erros comuns
Estes são os erros mais frequentes com range(), com a mensagem real que o Python mostra.
Passar um float para o range (TypeError)
1
2
for i in range(0, 1, 0.1):
print(i)
1
TypeError: 'float' object cannot be interpreted as an integer
Correção: range só aceita inteiros. Gere inteiros e divida: for i in range(10): print(i / 10). O mesmo erro aparece em range(len(lista) / 2), porque / sempre devolve float; use a divisão inteira //: range(len(lista) // 2).
Passar o valor do input() direto (TypeError)
1
2
3
n = input('Quantas vezes? ') # o usuário digita 3
for i in range(n):
print(i)
1
TypeError: 'str' object cannot be interpreted as an integer
Correção: input() sempre devolve texto. Converta antes: n = int(input('Quantas vezes? ')). Veja mais em input e print no Python.
Esperar que o fim (stop) seja incluído
1
2
for i in range(1, 5):
print(i, end=' ')
1
1 2 3 4
Não há mensagem de erro, mas o 5 não aparece. Correção: o fim é exclusivo, então some 1: range(1, 6) gera 1 2 3 4 5.
Usar passo zero (ValueError)
1
numeros = range(1, 10, 0)
1
ValueError: range() arg 3 must not be zero
Correção: com passo 0 o range nunca sairia do lugar. Use um passo positivo para subir ou negativo para descer.
Passo positivo com início maior que o fim (range vazio, sem erro)
1
2
3
for i in range(10, 0):
print(i)
print('O for não imprimiu nada')
1
O for não imprimiu nada
Correção: para contar de 10 até 1, informe o passo negativo: range(10, 0, -1).
Exercícios resolvidos
Tente resolver cada exercício antes de abrir a solução. Todos os códigos foram executados e as saídas conferidas.
Exercício 1. Gere uma lista com todos os números pares de 0 a 20, incluindo o 20.
Ver solução
1
2
pares = list(range(0, 21, 2))
print(pares)
Saída: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
O passo 2 pula de dois em dois, e o fim precisa ser 21 (ou 22) para o 20 entrar, já que o fim é exclusivo.
Exercício 2. Faça uma contagem regressiva de 10 até 1 na mesma linha e, no final, imprima Fogo!.
Ver solução
1
2
3
for i in range(10, 0, -1):
print(i, end=' ')
print('Fogo!')
Saída: 10 9 8 7 6 5 4 3 2 1 Fogo!
O passo -1 faz o range descer. O fim 0 não é incluído, por isso a contagem para no 1. O end=' ' troca a quebra de linha por um espaço.
Exercício 3. Calcule a soma de todos os números ímpares de 1 a 99 usando range().
Ver solução
1
2
soma = sum(range(1, 100, 2))
print(soma)
Saída: 2500
Começando em 1 com passo 2, o range gera só ímpares (1, 3, 5, …, 99). A função sum() aceita o range direto, sem precisar converter para lista.
Exercício 4. Imprima a tabuada do 7, de 7 x 1 até 7 x 10.
Ver solução
1
2
for i in range(1, 11):
print(f'7 x {i} = {7 * i}')
Saída:
1
2
3
4
5
6
7
8
9
10
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
7 x 10 = 70
range(1, 11) gera de 1 a 10. Um erro clássico aqui é escrever range(1, 10) e perder a última linha da tabuada.
Exercício 5. (Estilo prova) Qual é o resultado de list(range(2, 11, 3))?
a) [2, 5, 8, 11]
b) [2, 5, 8]
c) [3, 6, 9]
d) [2, 4, 6, 8, 10]
Ver solução
1
print(list(range(2, 11, 3)))
Saída: [2, 5, 8]
Resposta: b. O range começa no 2 e soma 3 a cada passo: 2, 5, 8. O próximo seria 11, mas o fim é exclusivo, então o 11 fica de fora (alternativa a). A alternativa c ignora o início e a d usa passo 2.
Exercício 6. (Estilo prova) Analise as afirmativas sobre a função range() do Python:
I. range(5) gera os números de 1 a 5.
II. range(1, 6) gera os números de 1 a 5.
III. range(10, 0, -1) inclui o número 0.
IV. range(8, 2) retorna uma sequência vazia, sem gerar erro.
Estão corretas apenas:
a) II
b) II e IV
c) I e III
d) I, II e IV
Ver solução
1
2
3
4
print(list(range(5)))
print(list(range(1, 6)))
print(list(range(10, 0, -1)))
print(list(range(8, 2)))
Saída:
1
2
3
4
[0, 1, 2, 3, 4]
[1, 2, 3, 4, 5]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[]
Resposta: b. A I é falsa porque range(5) começa no 0. A III é falsa porque o fim (0) nunca é incluído. A II e a IV são verdadeiras: com passo positivo e início maior que o fim, o range fica vazio sem erro.
Exercício 7. Reescreva o código abaixo trocando range(len(nomes)) por enumerate(), numerando a partir de 1.
1
2
3
nomes = ['Ana', 'Bruno', 'Carla']
for i in range(len(nomes)):
print(f'{i + 1}. {nomes[i]}')
Ver solução
1
2
3
nomes = ['Ana', 'Bruno', 'Carla']
for posicao, nome in enumerate(nomes, start=1):
print(f'{posicao}. {nome}')
Saída:
1
2
3
1. Ana
2. Bruno
3. Carla
O enumerate já entrega o índice e o valor, e o start=1 elimina o i + 1. Fica mais curto e sem risco de errar o índice.
Exercício 8. Sem usar float dentro do range, gere a lista [0.0, 0.5, 1.0, 1.5, 2.0].
Ver solução
1
2
valores = [i / 2 for i in range(5)]
print(valores)
Saída: [0.0, 0.5, 1.0, 1.5, 2.0]
O range(5) gera os inteiros 0 a 4, e dividir cada um por 2 produz os decimais de 0.5 em 0.5. Tentar range(0, 2.5, 0.5) daria TypeError.
Quer praticar range, loops e o resto da base com projetos guiados e suporte de professor? Conheça o nosso curso de Python completo, a Jornada Python.
Criei o Ebookr.ai, uma plataforma que usa IA para gerar ebooks profissionais sobre qualquer tema - com capa gerada por IA, infográficos automáticos e exportação em PDF. Confere!
Conclusão
Nesse post vimos uma função muito importante para geração de sequência de números em Python: a famosa range()! Vimos como start, stop e step funcionam, por que o fim nunca é incluído, como fazer contagem regressiva, por que o range não é uma lista e quando trocar range(len()) por enumerate().
Dominá-la bem é básico para todo desenvolvedor Python.
Se ficou com alguma dúvida, fique à vontade para deixar um comentário no box aqui embaixo! Será um prazer te responder! ![]()
Perguntas frequentes
O que é a função range em Python?
range() é uma função nativa do Python que gera uma sequência de números inteiros, muito usada com o laço for para repetir um bloco um número definido de vezes. Exemplo: for i in range(3): executa o bloco com i valendo 0, 1 e 2. Ela devolve um objeto range, que calcula os números sob demanda em vez de guardar todos na memória.
Qual a sintaxe da função range?
São três formas: range(fim), range(início, fim) e range(início, fim, passo). O início padrão é 0 e o passo padrão é 1. Exemplos: range(5) gera 0, 1, 2, 3, 4; range(1, 6) gera 1, 2, 3, 4, 5; range(0, 10, 2) gera 0, 2, 4, 6, 8. Todos os argumentos precisam ser inteiros.
O range inclui o último número?
Não. O valor de fim (stop) é sempre exclusivo: o range para um passo antes dele. Por isso range(1, 5) gera 1, 2, 3, 4, sem o 5. Para incluir o último número, some 1 ao fim: range(1, 6) gera 1 a 5. Com passo negativo vale a mesma regra: range(5, 0, -1) gera 5, 4, 3, 2, 1, sem o 0.
Pensando no laço for que percorre os números de 1 a 5, qual sintaxe representa corretamente essa estrutura?
A resposta correta é for i in range(1, 6):. O primeiro argumento do range (1) é incluído e o segundo (6) é excluído, então os valores de i são 1, 2, 3, 4 e 5. Alternativas como range(5) e range(0, 5) começam em 0, e range(1, 5) termina no 4.
Como fazer uma contagem regressiva com range?
Use um passo negativo e um início maior que o fim: range(10, 0, -1) gera 10, 9, …, 1. Como o fim é exclusivo, para chegar até o 0 use range(10, -1, -1). Outra opção é reversed(range(1, 11)). Sem o passo negativo, range(10, 0) fica vazio e o for não executa nenhuma vez.
O range retorna uma lista em Python?
Não. No Python 3, range() retorna um objeto do tipo range, uma sequência imutável que calcula cada número quando ele é pedido e ocupa sempre a mesma memória, não importa o tamanho. Ele aceita len(), o operador in, índice e fatiamento. Para obter uma lista de verdade, converta: list(range(5)) resulta em [0, 1, 2, 3, 4].
Posso usar números decimais (float) no range?
Não. range(0, 1, 0.1) gera TypeError: 'float' object cannot be interpreted as an integer, porque range só aceita inteiros. Para gerar decimais, use um range de inteiros e divida: [i / 10 for i in range(5)] resulta em [0.0, 0.1, 0.2, 0.3, 0.4]. Em projetos com NumPy, numpy.arange(0, 1, 0.25) aceita passo decimal.
Para que usamos os comandos range() e enumerate()?
range() gera uma sequência de inteiros e serve para repetir um bloco N vezes ou produzir números (for i in range(5):). enumerate() percorre uma coleção devolvendo pares (índice, valor), ideal quando você precisa do item e da posição ao mesmo tempo (for i, fruta in enumerate(frutas):). Para percorrer uma lista com índice, prefira enumerate a range(len(lista)).
"Porque o Senhor dá a sabedoria, e da sua boca vem a inteligência e o entendimento" Pv 2:6