image

Bootcamps ilimitados + curso de inglês para sempre

80
%OFF
Article image
Carlos CGS
Carlos CGS22/04/2025 17:14
Compartilhe

#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):

    1. 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):

    1. 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.

    image

    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!

    Compartilhe
    Recomendados para você
    Microsoft 50 Anos - Prompts Inteligentes
    Microsoft 50 Anos - GitHub Copilot
    Microsoft 50 Anos - Computação em Nuvem com Azure
    Comentários (2)
    Carlos CGS
    Carlos CGS - 22/04/2025 18:42

    Obrigado @Julio. Feliz por ter ajudado que seja um pouco.

    JA

    Julio Alves - 22/04/2025 18:31

    Tudo é novidade pra mim ... Este foi o primeiro projeto prático que tive contato ... Obrigado ... Deus continue te abençoando sempre 🙏🏻