Número Decrescente
Como gerar e usar número decrescente em Python
Um número decrescente é simplesmente uma sequência onde cada elemento é menor ou igual ao anterior. Parece óbvio, mas a forma como você implementa isso faz toda a diferença na prática. O jeito mais comum de criar uma sequência decrescente é usando range(início, fim, passo). O passo é o que define a direção. Para decrescer, use um número negativo: O detalhe importante aqui é o limite inferior. Se você colocar range(10, -1, -1), vai até o zero. Se errar o final e colocar range(10, 1, -1), para no 2 e nunca chega no 1. Já perdi vinte minutos caçando esse bug em código legado.
Funções que criam número decrescente via range() são eficientes em memória porque não armazenam a lista toda — elas geram sob demanda. Isso é bom para loops grandes. Mas se você quiser converter para lista rapidamente com list(range(1000000, 0, -1)), vai alocar milhões de inteiros na memória de uma vez. Em Python 3, o range é lazy; em Python 2, era uma lista já construída. Fique atento à versão. Também não adianta tentar modificar o range depois de criado. Ele é imutável. Se precisar alterar algo no meio do percurso, transforme em lista primeiro e depois ordene com sorted(lista, reverse=True).
Um caso real que me deixou na mão
Estava processando dados temporais reversos (último registro primeiro) e usei range(datafim, datainicio, -1) passando timestamps inteiros. O problema: alguns timestamps tinham granularidade de milissegundos e eu esqueci de normalizar. O loop pulava intervalos estranhos porque a diferença não era divisível por 1. A solução foi arredondar os timestamps para segundos antes de criar o range. Às vezes o range com passo negativo não resolve. Por exemplo, se precisar de uma sequência com decremento irregular — tipo [100, 90, 75, 55, 30] — aí a abordagem é diferente. Você pode usar matemática básica com fórmulas ou iterar sobre uma lista existente ordenada em ordem reversa com reversed(). Isso é mais flexível, mas custa O(n log n) no tempo de ordenação. Para sequências simples, range é mais rápido e direto.

Não use para buscar em estruturas ordenadas ascendentemente se puder usar busca binária nativa — isso é O(log n) contra O(n) de percorrer do maior pro menor. Também evite gerar listas enormes apenas para iterar. Use geradores sempre que possível. Se o seu dado já está em ordem crescente e você quer percorrer ao contrário, prefira reversed() do que reordenar ou criar cópias. Ele funciona em qualquer sequência indexável sem custo extra de memória.
Dica prática de performance
Em loops com milhão de iterações decrescentes, range puro em Python 3 roda em torno de 0,05 segundos. Converter para lista antes do loop dobra o tempo e triplica o uso de memória. A diferença é pequena por iteração, mas se o loop estiver dentro de outra estrutura repetida, o acumulado aparece. Para número decrescente com step não inteiro (ex: 0.5), range não aceita floats. Nesse caso, use numpy.arange(inicio, fim, -0.5) ou uma compreensão com float math. O numpy lida com passos fracionários de forma confiável.
import numpy as np
dec = np.arange(5.0, 0, -0.5)
print(dec)
array([5. , 4.5, 4. , 3.5, 3. , 2.5, 2. , 1.5, 1. , 0.5])
Esse é o caminho quando o range nativo não dá conta. O custo é importar o numpy, mas em projetos existentes costuma valer a pena pela clareza do código.

Galeria
-
Paraíso da Alfabetização: Ordem crescente e decrescente -
Crescer, aprender e sorrir! : Ordem crescente e decrescente -
Ordem Decrescente até 10 – Recursos Marinheira