Função range() no Python: como usar em loops, com exemplos

Cansado de programar?

Conheça a melhor e mais completa formação de Python e Django e sinta-se um programador verdadeiramente competente. Além de Python e Django, você também vai aprender Banco de Dados, SQL, HTML, CSS, Javascript, Bootstrap e muito mais!

Quero aprender Python e Django de Verdade! Quero aprender!
Suporte

Tire suas dúvidas diretamente com o professor

Projetos práticos

Projetos práticos voltados para o mercado de trabalho

Prática profissional

Formação moderna com foco na prática profissional

Download do Artigo

✅ 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() vs enumerate(), 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 range começ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: use list(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()

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? :thumbsup:

Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?

Sua assinatura não pôde ser validada.
Você fez sua assinatura com sucesso.

Assine as PyDicas e receba 30 dias do melhor conteúdo Python na sua Caixa de Entrada: direto e sem enrolação!

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ão 0.
  • stop (fim): o limite. Obrigatório e nunca incluído no resultado.
  • step (passo): quanto somar a cada volta. Opcional, padrão 1. 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.

:bulb: 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! :wink:

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)).

Começe agora sua Jornada na Programação!

Não deixe para amanhã o sucesso que você pode começar a construir hoje!

#newsletter Olá :wave: Curtiu o artigo? Então faça parte da nossa Newsletter! Privacidade Não se preocupe, respeitamos sua privacidade. Você pode se descadastrar a qualquer momento.