DEV Community

Felipe Cezar
Felipe Cezar

Posted on

Desmistificando a Função range() no Python: Análise de um Problema Prático

Fala, devs! 🚀

Hoje vamos destrinchar um problema prático no Python que testa a nossa atenção e o entendimento matemático por trás dos argumentos da famosa função range().

Muitas vezes negligenciamos o básico, mas pequenos detalhes em limites de intervalos podem gerar bugs inesperados. Vamos entender como resolver isso sem errar?


O Problema

Imagine que temos o seguinte comando e precisamos prever a sua saída:

print(list(range(a - 1, b + a, a)))
Enter fullscreen mode Exit fullscreen mode

Se definirmos as variáveis como a = 3 e b = 9, o resultado impresso será: [2, 5, 8, 11].

Vamos abrir o capô do Python e ver como o interpretador calcula isso passo a passo.


Anatomia da função range()

Antes de substituir os valores, precisamos lembrar a assinatura da função:

range(start, stop, step)

  • start: O ponto de partida do intervalo (inclusivo).
  • stop: O ponto de parada do intervalo (exclusivo).
  • step: O passo/incremento entre cada número.

Substituindo os Valores (Passo a Passo)

Adotando os valores a = 3 e b = 9, fazemos as seguintes operações matemáticas para descobrir os argumentos:

  1. Calculando o start:

    • Expressão: a - 1
    • Cálculo: 3 - 1 = 2
  2. Calculando o stop:

    • Expressão: b + a
    • Cálculo: 9 + 3 = 12
  3. Calculando o step:

    • Expressão: a
    • Valor: 3

O nosso comando final interpretado pelo Python será:

range(2, 12, 3)
Enter fullscreen mode Exit fullscreen mode

Construindo a sequência:

  • O primeiro elemento é o próprio start: 2
  • Somamos o passo (3): 2 + 3 = 5
  • Somamos o passo (3): 5 + 3 = 8
  • Somamos o passo (3): 8 + 3 = 11
  • O próximo elemento seria 11 + 3 = 14. Como 14 ultrapassa o nosso limite máximo (12), a função encerra a execução.

Ao envelopar a função com list(), os valores são jogados para dentro de uma lista, gerando a saída exata: [2, 5, 8, 11].


E se o número final desse exatamente 12, ele seria impresso?

Não. Essa é a maior casca de banana do range().

No nosso exemplo prático, o próximo passo pulou de 11 para 14, então o 12 nem chegou a ser cogitado pela matemática do loop. Mas imagine um cenário hipotético onde a matemática fizesse o valor bater cravado no limite.

Por exemplo: range(0, 12, 3)

  • Sequência: 0, 3, 6, 9...
  • O próximo valor lógico seria 12.

Mesmo batendo cravado, o 12 NÃO seria impresso.

O parâmetro stop trabalha com o conceito de intervalo aberto à direita na matemática: [start, stop). Isso significa que o Python itera até o número imediatamente anterior ao limite estabelecido, mas nunca inclui o valor do stop dentro da sequência gerada.

Se você precisa que o número 12 apareça em uma sequência que vai de 3 em 3, o seu stop precisaria ser, no mínimo, 13.


Conclusão

Sempre que se deparar com a função range() em desafios de código ou no dia a dia, lembre-se da regra de ouro: o início entra, o fim nunca entra.

Gostou da explicação? Deixe um comentário dizendo se você já caiu na pegadinha do limite exclusivo do range! 🧑‍💻

Top comments (0)