Números Ímpares De 1 A 10000 - Números ímpares De 1 A 10000 - RETOEDU
Números ímpares De 1 A 10000 - RETOEDU

Como gerar e trabalhar com números ímpares em Python

Todo mundo já precisou listar os números ímpares de 1 a 10000 pelo menos uma vez num exercício ou num script de produção. Parece bobagem, mas tem uns detalhes que todo mundo berra quando tropeça pela primeira vez. Vou falar do jeito que funciona na prática, não do livro didático. A forma mais imediata é com range():

impares = list(range(1, 10001, 2)) O terceiro argumento do range é o passo. Começa em 1, para antes de 10001, avança de 2 em 2. Pronto. Cem milésimos de segundo pra rodar e uma lista com exatamente 5000 elementos. Se você quiser só iterar e não guardar tudo na memória, esquece o list() e usa o range direto num for.

Números ímpares de 1 a 10000: o guia prático

Agora o que as pessoas não contam. Tem um erro comum que eu vi acontecer repetidamente em projetos reais. Quando você chama list(range(...)), o resultado é uma sequência, não uma lista de verdade. Em Python 3, range é um objeto lazy que gera os valores sob demanda. A diferença é importante porque se você passar esse range para alguma função que espera uma lista, como len() ou sorted(), funciona sem problema. Mas se você tentar usar métodos que só existem em list, como .append(), vai dar erro. A solução é simples: faça list(range(1, 10001, 2)). Ponto. Outro detalhe que pega muita gente: quando o limite superior é inclusivo no seu entendimento mas não é no range. range(1, 10000, 2) para em 9999, não em 10000. Como 10000 é par, não tem problema aqui, mas se o seu limite fosse ímpar — digamos, range(1, 10001, 2) — o último elemento seria exatamente 10001, que está fora do que você queria. Eu já perdi umas duas horas caçando um bug assim num script de exportação de dados, onde o relatório tinha um número a mais e quebrava a planilha do contador. A regra prática é: sempre coloque o limite superior como valor_alvo + 1 quando estiver lidando com ímpares.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Se o seu objetivo é só calcular a soma, existe uma fórmula que evita criar a lista inteira. A soma dos n primeiros ímpares é n². No caso de 1 a 10000, temos 5000 ímpares, então a soma é 5000 ao quadrado, que dá 25.000.000. Chequei isso rodando um generator expression no terminal: sum(i for i in range(1, 10001, 2)). O resultado bateu. A vantagem é que você não aloca memória pra lista. A desvantagem é que você não tem os números individualmente depois, só a soma. Se precisar dos valores depois, cria a lista mesmo. Quando eu trabalho com conjuntos maiores, tipo números ímpares de 1 a 1000000 ou mais, aí o range com list() consome memória de verdade. Um array de 500 mil inteiros em Python Ocupa uns 14 megabytes. Não é muito pra uma máquina atual, mas em serviços de produção com múltiplas requisições simultâneas, esse detalhe importa. Nesses casos, eu prefiro usar numpy. Com numpy, o array de inteiros ocupa cerca de 4 megabytes para 500 mil elementos, porque cada inteiro é armazenado em 8 bytes fixos, sem a sobrecarga de objeto do Python. A importação é um pouco mais lenta, mas a diferença é irrelevante pra operações pontuais.

Um ponto que muita gente erra é assumir que todos os números ímpares entre 1 e 10000 são primos. Não são. A maioria é composta. Só pra você ter uma ideia, dos 5000 ímpares nesse intervalo, aproximadamente 670 são primos. Se você precisa filtrar só os primos, tem que rodar um crivo ou uma verificação de primalidade. O crivo de Eratóstenes é o método padrão. Ele funciona assim: cria-se um array booleano de tamanho N, marca-se todos como verdadeiros a partir de 2, e para cada número primo encontrado, marca-se como falso todos os seus múltiplos. No final, os índices ainda marcados como verdadeiros são os primos. Filtrando só os ímpares do resultado, você consegue a lista exata de primos ímpares até 10000. Se você quer baixar ou copiar a lista pronta, não tem muito segredo. O código completo é esse aqui:

impares = list(range(1, 10001, 2)) print(impares) Isso imprime a lista completa no console. Se quiser salvar num arquivo de texto, basta abrir um arquivo e escrever cada linha. Para CSV ou JSON, use os módulos csv e json da biblioteca padrão. Nenhum pacote externo necessário.

Um aviso final: range com passo negativo também funciona. range(9999, 0, -2) gera os ímpares de forma decrescente. Se você Inverter a ordem por engano e esquecer o passo negativo, o range volta vazio e o código continua rodando silenciosamente. Já vi isso acontecer num deploy de sexta à tarde. O job processava zero registros e ninguém percebia porque não tinha exceção sendo levantada. Sempre adicione um assert ou um print de debug pra garantir que a sequência gerou o tamanho esperado, especialmente em scripts que rodam em background.