DEV Community

Cover image for Como Fazer um Validador de CPF com Python de forma simples e refatorada!
Carlos Henrique Garcia Soares
Carlos Henrique Garcia Soares

Posted on

5

Como Fazer um Validador de CPF com Python de forma simples e refatorada!

CPF ou Cadastro de Pessoa Fisica é um documento com numeração única que pertence a uma pessoa para sempre. Ele é composto de nove dígitos iniciais, mais dois dígitos verificadores, totalizando onze dígitos.

A validação do CPF baseia-se na análise dos nove primeiros dígitos em comparação com os dois últimos dígitos verificadores, sendo assim esta verificação é feita em duas partes, cada um com suas devidas particularidades.

Image description

- Primeira Validação:
Multiplicamos os nove primeiros dígitos do CPF pelos valores de 10 a 2.
Se a soma desses produtos dividida por 11 resultar em um resto menor ou igual a 1, o penúltimo dígito do CPF deve ser zero.
Se o resto for maior que 2, o penúltimo dígito do CPF deve ser 11 menos o resto.

- Segunda Validação:
Repetimos o processo, começando a multiplicação pelo número 11.
Adicionamos o primeiro dígito verificador na soma.
Verificamos novamente as regras para o último dígito do CPF.

Abaixo, um código que foi elaborado de forma explicativa e simples, sem a utilização de bibliotecas, para facilitar a compreensão, mesmo para aqueles que não conhecem a linguagem Python.

# 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()
Enter fullscreen mode Exit fullscreen mode

Abaixo, eu reescrevi o código, refatorando-o para torna-lo mais legível e fácil de entender, utilizando alguns artifícios da biblioteca re, possibilitando maior facilidade para manutenções futuras, deixando o código menor e mais enxuto.

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()
Enter fullscreen mode Exit fullscreen mode

Vamos Disseminar os Conhecimentos e Transbordar Tudo o que Aprendemos!



Segue o Link do meu GitHub com o código Simples: Meu GitHUb

Segue o Link do meu GitHub com o código Refatorado: Códigos

Segue o Link do meu LinkedIn: Meu LinkedIn

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs