Python
Validar e gerar CPF em Python
Só biblioteca padrão. Testado em Python 3.9+.
Validação
A função devolve true apenas quando o número tem 11 dígitos, não é uma sequência repetida e os dois dígitos verificadores conferem.
import re
def validar_cpf(valor: str) -> bool:
cpf = re.sub(r"\D", "", str(valor or ""))
# 11 dígitos e nada de sequências repetidas — elas passam no módulo 11.
if len(cpf) != 11 or cpf == cpf[0] * 11:
return False
# Peso posicional: n=9 usa pesos de 10 a 2; n=10, de 11 a 2.
def dv(n: int) -> int:
soma = sum(int(cpf[i]) * (n + 1 - i) for i in range(n))
resto = soma % 11
return 0 if resto < 2 else 11 - resto
return dv(9) == int(cpf[9]) and dv(10) == int(cpf[10])Geração
Sorteia os nove primeiros dígitos e calcula os verificadores — o mesmo caminho, ao contrário.
import random
def gerar_cpf() -> str:
base = [random.randint(0, 9) for _ in range(9)]
def dv(digitos: list[int]) -> int:
soma = sum(d * (len(digitos) + 1 - i) for i, d in enumerate(digitos))
resto = soma % 11
return 0 if resto < 2 else 11 - resto
d1 = dv(base)
d2 = dv(base + [d1])
return "".join(map(str, base + [d1, d2]))Uso
validar_cpf("111.444.777-35") # True
validar_cpf("111.111.111-11") # False
gerar_cpf() # '52998224725'Os dois pontos em que essas funções costumam quebrar
Toda implementação de CPF erra nos mesmos dois lugares, e as duas armadilhas estão tratadas no código acima:
- Resto 0 ou 1. Quando o resto da divisão por 11 é menor que 2, o dígito verificador é
0— e não11 - resto, que daria 10 ou 11. Pular essa regra faz o validador rejeitar cerca de um terço dos CPFs legítimos. - Dígitos repetidos.
111.111.111-11e as outras nove sequências iguais passam na conta do módulo 11. Como são exatamente o que se digita para testar um formulário, precisam de uma verificação à parte.
A explicação completa da aritmética, com exemplo resolvido dígito a dígito, está emcomo validar um CPF.
Números para testar
Para exercitar a função com dados de verdade, o gerador produz até 1000 CPFs válidos por vez e exporta em .txt, .csv ou .json — pronto para virar fixture do seu conjunto de testes.
Casos que vale incluir na suíte: 111.444.777-35 (válido),111.111.111-11 (repetido, deve falhar), 123 (curto demais) e uma string vazia.
Outras linguagens
JavaScript · TypeScript · PHP · Java · C#