Módulo 5 - Módulos e a biblioteca padrão

Prática: um utilitário com Counter e random

11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Contar as palavras de um texto com Counter e limpar a entrada.
  • Encontrar as palavras mais frequentes com most_common.
  • Sortear um item de uma lista com random.choice.
  • Reunir tudo em um pequeno utilitário reaproveitável.

Contar as palavras de um texto

Esta aula é mão na massa. Vamos construir, passo a passo, um utilitário que analisa um texto e faz um sorteio, usando só o que este módulo ensinou. Comece com o problema mais concreto: dado um texto qualquer, quais são as palavras que mais aparecem? A receita tem duas etapas. Primeiro, preparar o texto, deixando tudo em minúsculas e quebrando em palavras. Depois, contar, o que o Counter faz sozinho. Veja a primeira versão.

from collections import Counter

texto = """Python e simples e Python e poderoso.
Com Python voce automatiza tarefas e Python organiza dados."""

# normalizar (minusculas) e tokenizar (quebrar em palavras)
palavras = texto.lower().split()
contagem = Counter(palavras)

print("Total de palavras:", len(palavras))       # 15
print("Palavras diferentes:", len(contagem))     # 11
print(contagem.most_common(3))
# [('python', 4), ('e', 3), ('python.', 1) ...] veja o problema da pontuacao

Primeira versão: conta, mas a pontuação gruda na palavra e atrapalha.

Rodou, mas apareceu um problema real: python. com o ponto grudado conta separado de python. É o tipo de detalhe que só surge com dados de verdade, e lidar com isso faz parte do ofício. Para esta prática, uma limpeza simples resolve: trocar a pontuação por espaço antes de quebrar. Não precisa de nada sofisticado; um pequeno tratamento já deixa a contagem honesta, como você vê na próxima seção.

Limpar a entrada e sortear

Vamos melhorar a contagem tirando a pontuação e, de quebra, trazer o random para o utilitário. A ideia do sorteio: entre as palavras mais frequentes, escolher uma ao acaso, como se fosse a palavra do dia daquele texto. Assim o utilitário faz duas coisas úteis, analisar e sortear, cada uma com um módulo da biblioteca padrão. Repare como o código continua curto porque as ferramentas prontas fazem o trabalho pesado.

from collections import Counter
import random

texto = "Python e simples. Python e poderoso! Com Python, voce automatiza."

# limpar: troca pontuacao por espaco, depois normaliza e tokeniza
for sinal in ".,!?;:":
    texto = texto.replace(sinal, " ")
palavras = texto.lower().split()

contagem = Counter(palavras)
top3 = contagem.most_common(3)
print("Mais comuns:", top3)
# Mais comuns: [('python', 3), ('e', 2), ('simples', 1)]

# sortear uma entre as mais comuns
nomes_top = [palavra for palavra, _ in top3]
sorteada = random.choice(nomes_top)
print("Palavra do dia:", sorteada)   # ex.: python

Com a pontuação removida, a contagem fica correta e o random escolhe a palavra do dia.

Note que a compreensão de lista, do módulo 2, reapareceu naturalmente para separar os nomes das contagens. É assim que o intermediário se acumula: cada recurso novo entra no seu repertório e passa a aparecer misturado aos outros. Você limpou dados de verdade, contou com o Counter, resumiu com most_common e sorteou com random, tudo em poucas linhas, sem instalar nada. Falta só empacotar isso em funções para virar um utilitário de verdade.

Empacotar em um utilitário

Um monte de código solto vira um utilitário quando você separa em funções com nomes claros e junta tudo sob o guarda do __main__, como você aprendeu na aula de módulos próprios. Cada função faz uma coisa: uma conta as palavras, outra sorteia. O bloco final demonstra o uso. Se um dia você importar este arquivo em outro projeto, ganha as duas funções sem os prints de demonstração atrapalhando. Este é o fecho do módulo, reunindo quase tudo que ele ensinou.

from collections import Counter
import random

def contar_palavras(texto):
    """Devolve um Counter com as palavras do texto, limpo e normalizado."""
    for sinal in ".,!?;:":
        texto = texto.replace(sinal, " ")
    return Counter(texto.lower().split())

def palavra_do_dia(contagem, entre_top=3):
    """Sorteia uma palavra entre as mais frequentes."""
    nomes = [palavra for palavra, _ in contagem.most_common(entre_top)]
    return random.choice(nomes)

# so roda ao executar o arquivo direto, nao ao importa-lo
if __name__ == "__main__":
    amostra = "Estudar Python todo dia. Python compensa. Estude com foco!"
    c = contar_palavras(amostra)
    print("Top 3:", c.most_common(3))
    print("Palavra do dia:", palavra_do_dia(c))

O utilitário completo: duas funções limpas e um bloco de demonstração sob o guarda do __main__.

Olhe o que você construiu. Um arquivo que pode rodar sozinho, mostrando a análise de um texto de exemplo, ou ser importado por outro programa, oferecendo as funções contar_palavras e palavra_do_dia prontas. Ele usa três peças da biblioteca padrão, Counter, random e o padrão do __main__, e reaproveita a compreensão de lista do início do curso. Isso é organização de nível intermediário: código separado por responsabilidade, testável e pronto para crescer. No próximo módulo você sai da biblioteca padrão e aprende a instalar e usar pacotes externos.

Teste rápido

No utilitário final, por que a demonstração ficou dentro do if __name__ == "__main__"?

Perguntas frequentes

Por que preciso limpar a pontuação antes de contar?
Porque o split separa só por espaços, então "python." com ponto grudado vira uma palavra diferente de "python". Trocar a pontuação por espaço antes de quebrar faz as duas contarem juntas. Sem essa limpeza, a contagem fica distorcida por causa de vírgulas e pontos.
Para que serve o lower() na contagem de palavras?
Para normalizar: sem ele, "Python" e "python" contariam como palavras diferentes só por causa da letra maiúscula. Ao passar tudo para minúsculas com lower antes de contar, você garante que a mesma palavra, escrita de formas diferentes, some na mesma contagem.
O que faz a expressão [palavra for palavra, _ in top3]?
É uma compreensão de lista que percorre top3, onde cada item é um par de palavra e contagem, e guarda só a palavra. O sublinhado _ é um nome convencional para o valor que você recebe mas não usa, aqui a contagem. O resultado é uma lista só com os nomes das palavras.
Toda vez que rodo, a palavra do dia muda?
Pode mudar, porque random.choice sorteia entre as mais frequentes a cada execução. Se você quiser um resultado fixo para testar, defina uma semente com random.seed antes do sorteio, e a escolha se repete. Sem semente, cada execução pode trazer uma palavra diferente do topo.
Este utilitário está pronto para qualquer texto?
Para textos simples em português, sim. Ele ignora maiúsculas e a pontuação básica. Casos mais avançados, como remover palavras muito comuns (de, a, o) ou tratar acentos, pedem um pouco mais de código. Como exercício, tente adicionar uma lista de palavras a ignorar antes de contar.
Dá para reaproveitar essas funções em outro programa?
Sim, e é justamente por isso que elas ficaram em funções e a demonstração sob o guarda do __main__. Basta salvar o arquivo como, por exemplo, texto.py e escrever from texto import contar_palavras em outro programa. Você recebe as funções sem os prints de teste rodarem junto.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.