#16 - Como criar um validador de CPF com Python🧾
🌌 Projeto CodeVerse Python - #16/2025
Fala Galera Dev! 🚀
Neste artigo vamos juntos explorar um projeto prático com a linguagem python, entendendo e escrevendo um script para validar CPF, verificando se o CPF é verdadeiro ou falso.
Bora entender como funciona a validação de um CPF e, de quebra, ver duas formas diferentes de fazer o mesmo código Python: uma simples, e outra usando boas práticas?Vem comigo nessa missão no universo do CodeVersePython 🚀
____________________________________________________________________________________________
🧾 Porque o CPF possui dígitos de validação?
O CPF (Cadastro de Pessoas Físicas) é como se fosse o RG digital da Receita Federal. Ele serve pra te identificar como cidadão nas questões financeiras e tributárias, tipo abrir conta em banco, declarar imposto de renda, comprar um chip de celular ou até mesmo fazer uma matrícula.
Mas… já reparou que o CPF tem 11 dígitos? Exemplo: 123.456.789-09
Os dois últimos (-09) não são aleatórios: eles são os dígitos verificadores, um tipo de "senha matemática" que serve pra garantir que o número é válido e não foi digitado errado. Ou seja, se você mudar um número do CPF e tentar usar, ele provavelmente vai ser rejeitado, porque o cálculo dos dígitos finais não vai bater.
🔍 Por que existem dígitos de verificação?
É simples: evitar fraudes e erros de digitação.
Imagina um sistema com milhões de CPFs cadastrados. Com os dígitos verificadores, dá pra conferir em segundos se aquele CPF foi digitado corretamente ou não, sem nem precisar consultar um banco de dados.
É como se o próprio número dissesse:
“Ei, fui gerado por um cálculo certinho, pode confiar!”
____________________________________________________________________________________________
🧠 Como validar um CPF? Entenda a lógica por trás dos dígitos
Já sabemos que o CPF é formado por 11 dígitos, sendo os 9 primeiros os números principais e os 2 últimos os dígitos verificadores — como se fossem os “guardiões” que protegem a autenticidade desse número.
Imagina que o CPF é uma senha com verificação dupla: os dois últimos números são como senhas de segurança geradas a partir dos 9 primeiros. Se elas baterem com o que foi gerado pelo cálculo, o CPF é válido. Se não... é cilada, rs 😅
O CPF tem 11 números, sendo os dois últimos dígitos (os verificadores) usados para garantir que o CPF foi digitado corretamente. Eles são calculados com base nos 9 primeiros números.
✅ Como validar o 1º dígito verificador (DV1):
- Pegue os 9 primeiros dígitos do CPF.
- Exemplo: 529.982.247-XX → pegamos: 5 2 9 9 8 2 2 4 7
2. Atribua pesos decrescentes de 10 até 2.
5×10 + 2×9 + 9×8 + 9×7 + 8×6 + 2×5 + 2×4 + 4×3 + 7×2
= 50 + 18 + 72 + 63 + 48 + 10 + 8 + 12 + 14
= 295
3. Multiplicou tudo? Agora faz:
resto = 295 % 11 = 9
4. Regrinha final:
- e resto < 2 → DV1 = 0
- Senão → DV1 = 11 - resto
DV1 = 11 - 9 = 2
💡 Resultado: o 1º dígito verificador deve ser 2.
✅ Como validar o 2º dígito verificador (DV2):
- Pegue os mesmos 9 dígitos, mas inclua o 1º dígito verificador.
- Ficamos com: 5 2 9 9 8 2 2 4 7 2
2. Agora, os pesos vão de 11 até 2:
5×11 + 2×10 + 9×9 + 9×8 + 8×7 + 2×6 + 2×5 + 4×4 + 7×3 + 2×2
= 55 + 20 + 81 + 72 + 56 + 12 + 10 + 16 + 21 + 4
= 347
3. Faz de novo:
resto = 347 % 11 = 6
4. Aplica a mesma regrinha:
- Se resto < 2 → DV2 = 0
- Senão → DV2 = 11 - resto
DV2 = 11 - 6 = 5
💡 Resultado: o 2º dígito verificador deve ser 5.
Agora que temos:
- DV1(Digito_Verificador_1) = 2
- DV2(Digito_Verificador_2) = 5
O CPF completo válido é: 529.982.247-25 ✅
____________________________________________________________________________________________
🔍 Falar é Fácil, Mostre-me o Código! (Linus Torvalds)
Agora vamos ver as duas formas de criar o mesmo código, porém para deixar nosso código mais completo usei uma lógica que mostra o estado que o CPF foi emitido
> Para isso usamos o 9º dígito do CPF (antepenúltimo), que indica o estado onde o CPF foi emitido. Isso era usado antigamente, quando a emissão do CPF era feita presencialmente em cada estado. Hoje, o processo é mais unificado, mas esse número ainda segue a mesma lógica de origem.
Nono dígito do CPF X Estado emitente
____________________________________________________________________________________________
🧪 Exemplo 1 - Código simples (funciona, mas pode melhorar):
Esse código funciona e é fácil de entender, principalmente pra quem tá começando.Ele mostra passo a passo os cálculos — tipo uma receita escrita à mão, direto no caderno da vovó 👵
# Criado abaixo uma função para validar um CPF digitado.
NOVO_CPF = list(input("Digite um CPF para ser validado >>>"))
NOVO_CPF_STRING = " ".join(NOVO_CPF)
def validacao_cpf():
if len(NOVO_CPF) == 11:
primeiro1 = int(NOVO_CPF[0]) * 10
primeiro2 = int(NOVO_CPF[1]) * 9
primeiro3 = int(NOVO_CPF[2]) * 8
primeiro4 = int(NOVO_CPF[3]) * 7
primeiro5 = int(NOVO_CPF[4]) * 6
primeiro6 = int(NOVO_CPF[5]) * 5
primeiro7 = int(NOVO_CPF[6]) * 4
primeiro8 = int(NOVO_CPF[7]) * 3
primeiro9 = int(NOVO_CPF[8]) * 2
seg_primeiro1 = int(NOVO_CPF[0]) * 11
seg_primeiro2 = int(NOVO_CPF[1]) * 10
seg_primeiro3 = int(NOVO_CPF[2]) * 9
seg_primeiro4 = int(NOVO_CPF[3]) * 8
seg_primeiro5 = int(NOVO_CPF[4]) * 7
seg_primeiro6 = int(NOVO_CPF[5]) * 6
seg_primeiro7 = int(NOVO_CPF[6]) * 5
seg_primeiro8 = int(NOVO_CPF[7]) * 4
seg_primeiro9 = int(NOVO_CPF[8]) * 3
seg_primeiro10 = int(NOVO_CPF[9]) * 2
soma_validacao = (primeiro1 + primeiro2 + primeiro3 + primeiro4 + primeiro5 + primeiro6 + primeiro7 + primeiro8 + primeiro9)
divisao_soma = (soma_validacao // 11)
resto = (soma_validacao - (11 * divisao_soma))
soma_validacao_2 = (seg_primeiro1 + seg_primeiro2 + seg_primeiro3 + seg_primeiro4 + seg_primeiro5 + seg_primeiro6 + seg_primeiro7 + seg_primeiro8 + seg_primeiro9 + seg_primeiro10)
divisao_soma_2 = (soma_validacao_2 // 11)
resto_2 = (soma_validacao_2 - (11 * divisao_soma_2))
antepenultimo_digito_cpf = int(NOVO_CPF[8])
penultimo_digito_cpf = int(NOVO_CPF[9])
ultimo_digito_cpf = int(NOVO_CPF[10])
val_1 = False
val_2 = False
val_3 = False
val_4 = False
if(resto <=1) and (penultimo_digito_cpf == 0):
val_1 = True
if( resto >=2 and resto < 10) and (11 - resto == penultimo_digito_cpf):
val_2 = True
if( resto_2 <=1 ) and (ultimo_digito_cpf == 0):
val_3 = True
if ( resto_2 >=2 and resto_2 < 10 ) and (11 - resto_2 == ultimo_digito_cpf):
val_4 = True
else: ()
if (val_1 == True or val_2 == True) and (val_3 == True or val_4 == True):
print(f"O CPF número: {NOVO_CPF_STRING} é válido !")
else:
print(f"O CPF número: {NOVO_CPF_STRING} é inválido, tente novamente.")
#Abaixo Validação dos estado de origem do CPF
if antepenultimo_digito_cpf == 1:
print("Seu CPF é originário do estado do Distrito Federal, Goiás, Mato Grosso do Sul ou Tocantins")
elif antepenultimo_digito_cpf == 2:
print("Seu CPF é originário do estado do Pará, Amazonas, Acre, Amapá, Rondônia ou Roraima")
elif antepenultimo_digito_cpf == 3:
print("Seu CPF é originário do estado do Ceará, Maranhão ou Piauí")
elif antepenultimo_digito_cpf == 4:
print("Seu CPF é originário do estado de Pernambuco, Rio Grande do Norte, Paraíba ou Alagoas")
elif antepenultimo_digito_cpf == 5:
print("Seu CPF é originário do estado da Bahia; e Sergipe")
elif antepenultimo_digito_cpf == 6:
print("Seu CPF é originário de Minas Gerais")
elif antepenultimo_digito_cpf == 7:
print("Seu CPF é originário do estado do Rio de Janeiro ou Espírito Santo")
elif antepenultimo_digito_cpf == 8:
print("Seu CPF é originário do estado de São Paulo")
elif antepenultimo_digito_cpf == 9:
print("Seu CPF é originário do estado do Paraná ou Santa Catarina")
else:
print("Seu CPF é de origem do estado do Rio Grande do Sul")
else:
print(f"O CPF número: {NOVO_CPF_STRING} é inválido, tente novamente.")
validacao_cpf()
✅ Prós: Funciona, está didático para quem está começando.
⚠️ Contras: Muito repetitivo, difícil de manter, não segue boas práticas como reuso de código e modularização.
🧪 Exemplo 2 - Código com boas práticas e legibilidade:
Aqui, usamos boas práticas, como validação com regex, dicionários, e list comprehension.É como usar um robô de cozinha: você coloca os ingredientes, aperta um botão e ele faz tudo pra você. Muito mais limpo, moderno e reutilizável!
import re
def validador():
cpf = input("Digite um CPF para ser validado ao lado. >>>")
# Retira apenas os dígitos do CPF, ignorando os caracteres especiais
numeros = [int(digito) for digito in cpf if digito.isdigit()]
formatacao = False
quant_digitos = False
validacao1 = False
validacao2 = False
# Verifica a estrutura do CPF (111.222.333-44) ou (11122233344)
if re.match(r'\d{3}\.\d{3}\.\d{3}-\d{2}', cpf) or re.match(r'\d{11}', cpf):
formatacao = True
if len(numeros) == 11:
quant_digitos = True
soma_produtos = sum(a * b for a, b in zip(numeros[0:9], range(10, 1, -1)))
digito_esperado = (soma_produtos * 10 % 11) % 10
if numeros[9] == digito_esperado:
validacao1 = True
soma_produtos1 = sum(a * b for a, b in zip(numeros[0:10], range(11, 1, -1)))
digito_esperado1 = (soma_produtos1 * 10 % 11) % 10
if numeros[10] == digito_esperado1:
validacao2 = True
if quant_digitos and formatacao and validacao1 and validacao2:
print(f"O CPF {cpf} é válido.")
else:
print(f"O CPF {cpf} não é válido... Tente outro CPF...")
# Verificação dos estados de origem do CPF
estado_origem = numeros[8]
estados = {
1: "Distrito Federal, Goiás, Mato Grosso do Sul ou Tocantins",
2: "Pará, Amazonas, Acre, Amapá, Rondônia ou Roraima",
3: "Ceará, Maranhão ou Piauí",
4: "Pernambuco, Rio Grande do Norte, Paraíba ou Alagoas",
5: "Bahia ou Sergipe",
6: "Minas Gerais",
7: "Rio de Janeiro ou Espírito Santo",
8: "São Paulo",
9: "Paraná ou Santa Catarina"
}
if estado_origem in estados:
print(f"Seu CPF é originário do estado de {estados[estado_origem]}.")
else:
print("Seu CPF é de origem do estado do Rio Grande do Sul")
else:
print(f"O CPF {cpf} não é válido... Tente outro CPF...")
validador()
✅ Prós:
- Reutiliza código com zip e sum, reduzindo linhas repetidas.
- Usa dicionário para verificar origem do CPF.
- Mais legível e fácil de entender.
- Validação baseada em regex.
____________________________________________________________________________________________
💡 Concluindo...
Neste artigo, mostramos que o mesmo problema pode ser resolvido de formas diferentes.
Um código simples pode ser funcional, mas à medida que evoluímos como devs, buscamos melhorar a legibilidade, manutenção e eficiência do que escrevemos, deixando de escrever recitas de bolo, para escrevermos códigos estruturados e eficientes, de fácil legibilidade e manutenção.
Esse tipo de comparação é excelente pra mostrar sua evolução como dev e também para ensinar quem está começando no Python. Espero ter te apresentado de forma bem prática como a palicação dos conceitos aprendidos na sua jornada impactam nos seus códigos, tornando-os mais eficientes e mostrando a maturidade galgada através de tempo de cadeira e dedicação ao aprendizado do dia a dia que se reflete no seu código.
Esses dois exemplos de código foram meus próprios códigos de quando iniciei no aprendizado da linguagem python e como a uso atualmente, ainda aprendendo e evoluindo, porpme melhor do que há algum tempo atrás.
Se curtiu esse conteúdo, compartilha com a galera e comenta como você validaria o CPF com Python! 🚀🐍
👉 Me acompanhe no LinkedIn e no GitHub do Projeto CodeVerse Python 2025 para mais conteúdos como esse!