O Gerador De CPF O Gerador De CPF

Gerar CPF em Python: Função com Testes pytest

Automatizar a geração de CPFs em Python é essencial quando scripts, APIs ou pipelines de dados precisam de números válidos sob demanda — sem depender de gerar CPF online. A função abaixo implementa o algoritmo de módulo 11 de forma limpa e idiomática.

Código

import random


def gerar_cpf() -> str:
    digits = [random.randint(0, 9) for _ in range(9)]

    soma1 = sum(d * (10 - i) for i, d in enumerate(digits))
    r1 = soma1 % 11
    d1 = 0 if r1 < 2 else 11 - r1
    digits.append(d1)

    soma2 = sum(d * (11 - i) for i, d in enumerate(digits))
    r2 = soma2 % 11
    d2 = 0 if r2 < 2 else 11 - r2
    digits.append(d2)

    return ''.join(str(d) for d in digits)


def validar_cpf(cpf: str) -> bool:
    import re
    clean = re.sub(r'[^\d]', '', str(cpf))
    if len(clean) != 11:
        return False

    if clean == clean[0] * 11:
        return False

    soma1 = sum(int(clean[i]) * (10 - i) for i in range(9))
    r1 = soma1 % 11
    d1 = 0 if r1 < 2 else 11 - r1
    if int(clean[9]) != d1:
        return False

    soma2 = sum(int(clean[i]) * (11 - i) for i in range(10))
    r2 = soma2 % 11
    d2 = 0 if r2 < 2 else 11 - r2
    return int(clean[10]) == d2

Análise do código

gerar_cpf usa list comprehension com random.randint(0, 9) para criar os 9 dígitos base. O primeiro verificador é calculado com sum() e enumerate(), aplicando módulo 11. O segundo verificador repete o cálculo com os 10 dígitos (incluindo o primeiro verificador).

validar_cpf limpa a entrada com re.sub, rejeita CPFs com todos os dígitos iguais (clean[0] * 11), e recalcula os dois verificadores. Está incluída como função auxiliar para os testes.

O retorno é sempre uma string de 11 caracteres, preservando zeros à esquerda. O uso de -> str e -> bool nas type hints segue as boas práticas do Python moderno.

Uso

cpf = gerar_cpf()
print(cpf)              # "52998224725" (exemplo)
print(validar_cpf(cpf)) # True

Testes

Testes com pytest:

def test_gerar_cpf_tem_11_digitos():
    cpf = gerar_cpf()
    assert len(cpf) == 11
    assert cpf.isdigit()


def test_gerar_cpf_e_valido():
    cpf = gerar_cpf()
    assert validar_cpf(cpf) is True


def test_gerar_cpf_sao_diferentes():
    cpfs = {gerar_cpf() for _ in range(50)}
    assert len(cpfs) > 1

Veja também: validar CPF em Python e o gerador de CPF online.