O que são e como funcionam os ranges em Python.
Aprendemos nas últimas lições sobre as coleções do Python, que são muito úteis para guardar múltiplos valores.
Além delas, existe o tipo range. Ele tem um funcionamento parecido com o das coleções, mas possui algumas características que o tornam único.
rangeUm range representa uma sequência imutável de números inteiros. Ele define um intervalo numérico que tem uma estrutura bem clara: início, fim e passo em que seus itens aumentam ou diminuem.
Quando ele é criado, o Python não gera todos os números de uma vez. Em vez disso, ele cria um objeto que guarda apenas as regras do nosso intervalo:
1intervalo = range(0, 5, 1) 2 3print(intervalo) 4 5# Saída: 6# range(0, 5)
Esse funcionamento é seu principal diferencial, fazendo com que ele seja muito eficiente, econômico em memória e ideal para representar sequências numéricas previsíveis quando não precisamos visualizar cada um de seus itens.
Outra característica importante é que ele é imutável, ou seja, ele não pode ser alterado depois de criado. Dessa forma, não conseguimos adicionar, remover ou modificar valores dentro dele. Então, se você precisar de algo diferente, será necessário criar um novo intervalo com novas regras.
Se quiser confirmar se um valor é do tipo range, você pode fazer da seguinte forma:
1intervalo = range(0, 5, 1) 2 3print(type(intervalo)) 4 5
rangePara funcionar, o range precisa ter as informações que vimos lá no início dessa lição: início, fim e passo em que seus itens aumentam ou diminuem.
Eles aparecem sempre nessa ordem:
1range(inicio, fim, passo)
Apesar dessas três informações serem necessárias, você não precisa sempre fornecer todas elas. Quando alguma não é fornecida, o valor padrão dela é utilizado para criar o intervalo.
Na prática, você pode usar a função passando uma, duas ou três informações:
range(fim)range(inicio, fim)range(inicio, fim, passo)Agora, vamos nos aprofundar em como cada uma dessas alternativas funciona.
Quando passamos apenas um valor, ele representa o fim da sequência: range(fim). Nesse caso, o início assume automaticamente o valor 0 e o passo, o valor 1.
Dessa forma, o intervalo gerado vai do 0 até o número anterior ao fim, o 4:
1intervalo = range(5) # equivale a range(0, 5, 1) 2 3print(intervalo) 4print(list(intervalo))
Repare que o valor final, o 5, não é incluído. Um range sempre para antes do valor final, então ele parou antes de 5, indo até o número 4. Para ir até o número 5, devemos usar a função range(6).
Também podemos definir explicitamente onde a sequência começa e onde termina. Nesse caso, informamos range(inicio, fim):
1intervalo = range(2, 6) # equivale a range(2, 6, 1) 2 3print(intervalo) 4print(list(intervalo
Assim como quando passamos só uma das informações, aqui o passo automaticamente recebe o valor 1 também.
O terceiro valor que podemos passar para o range() define o passo, ou seja, de quanto em quanto os valores avançam. O formato a ser informado é: range(inicio, fim, passo).
Observe:
1intervalo = range(1, 10, 2) 2 3print(intervalo) 4print(list(intervalo
Acima, o passo definido foi 2. Então os números vão aumentando de 2 em 2.
Também é possível usar passos negativos, como -1, para criar sequências decrescentes:
1intervalo = range(5, 0, -1) 2 3print(intervalo) 4print(list(
Repare que, com o passo negativo, o início guarda o número maior e fim guarda o número menor.
Outra opção é deixar o usuário escolher qual será o início, fim e passo:
1inicio = int(input("Qual é o primeiro número da sequência?")) 2fim = int(input("Qual é o último número da sequência?")) 3passo = int(
Não esqueça que o tipo de dado recebido pelo input() sempre é str. Como o range() só aceita valores do tipo int, precisamos converter a string para o tipo numérico inteiro com a função int().
range e listVocê deve ter percebido nos exemplos acima que, para visualizar todos os itens de cada range, nós o convertemos para o tipo list, dessa forma:
1intervalo = range(3, 8) 2 3print(list(intervalo)) 4 5# Saída:
Essa conversão cria uma lista na memória contendo todos os valores do range. Porém, é importante ressaltar que ele não precisa ser convertido para outro formato para ser útil e que ele não é nem uma lista nem uma coleção tradicional. Ele é um objeto iterável.
Como já vimos, seu principal diferencial é exatamente representar uma sequência de números inteiros sem armazenar cada um dos números diretamente na memória, como a lista faz. Abaixo, você vai vê-lo sendo utilizado sem a conversão.
O range é uma sequência, então podemos acessar seus valores usando índices, assim como em listas:
1intervalo = range(10) 2print(intervalo[2]) 3 4# Saída: 5# 2
Também é possível usar fatiamento (slicing):
1intervalo = range(10) 2print(intervalo[:4]) 3 4# Saída: 5# range(0, 4)
Note que o resultado do fatiamento ainda é um range, não uma lista.
rangePodemos descobrir quantos elementos existem em um range usando a função len():
1intervalo = range(0, 10, 2) 2print(len(intervalo)) 3 4# Saída:
Aqui, não é necessário gerar a lista [0, 2, 4, 6, 8] para saber que o range(0, 10, 2) possui 5 números ao total. O Python calcula esse valor com base nas regras do intervalo, sem precisar gerar a sequência inteira.
Vimos como o range é ideal sempre que precisamos representar intervalos numéricos previsíveis. Em breve, vamos explorar como ele se conecta com estruturas que executam ações repetidas nos nossos códigos.