Módulo 12 - Trabalhando com textos

Contando caracteres e palavras: len, split e join

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

O que você vai aprender

  • Explicar o que len() conta numa string, incluindo espaços e pontuação.
  • Contar caracteres úteis combinando len() com .replace().
  • Quebrar uma frase em uma lista de palavras com .split() e contá-las.
  • Juntar uma lista de palavras de volta numa string com " ".join().

O len() a fundo: tudo conta

O len() é velho conhecido: apareceu no módulo 4 medindo strings e voltou no módulo 10 contando itens de lista. O que esta aula acrescenta é precisão sobre o que ele conta num texto. A resposta é: absolutamente tudo. Cada letra, cada espaço, cada vírgula e cada ponto é um caractere, e todos entram na conta. Não existe caractere mais importante que outro para o len().

print(len("Python"))        # 6
print(len("Olá, mundo!"))   # 11 (a vírgula, o espaço e a exclamação contam)
print(len("   "))           # 3 (só espaços, e ainda assim conta 3)
print(len(""))              # 0 (a string vazia é a única com tamanho zero)

Quatro medições. A do meio derruba a ilusão de que espaço não vale nada.

Esse comportamento explica de vez o bug do espaço invisível da aula 2: "sim " tem len() 4, "sim" tem 3, logo são strings diferentes. E abre uma pergunta prática: se eu quiser contar só as letras de um nome, ignorando os espaços? A resposta combina duas ferramentas que você já tem. O .replace(" ", "") remove os espaços, e o len() mede o que sobrou: len("João da Silva".replace(" ", "")) devolve 11, as letras de fato. Essa combinação volta na prática do módulo.

Contando palavras com split

Contar caracteres é útil, mas muitas perguntas do mundo real são sobre palavras: quantas palavras tem esta frase? Quais são elas? O método .split() responde as duas de uma vez, quebrando a string numa lista de pedaços. Chamado sem argumentos, ele quebra nos espaços em branco, e com inteligência: vários espaços seguidos valem como um separador só, e espaços nas pontas são ignorados. É o casamento perfeito entre as strings deste módulo e as listas do módulo 10.

frase = "aprender python mudou minha rotina"
palavras = frase.split()

print(palavras)        # ['aprender', 'python', 'mudou', 'minha', 'rotina']
print(len(palavras))   # 5

# O split sem argumento perdoa a bagunça de espaços:
bagunca = "   João   da    Silva "
print(bagunca.split())   # ['João', 'da', 'Silva']

O split devolve uma lista; o len() na lista conta as palavras. Espaços extras não atrapalham.

Repare no segundo exemplo, porque ele é um presente: a string veio suja, com espaços sobrando por todo lado, e o .split() sem argumento devolveu a lista limpa, sem strings vazias no meio. Para separar palavras de entrada de usuário, esse comportamento tolerante é exatamente o que você quer. O .split() também aceita um separador explícito, como "maçã,uva,pera".split(",") para dados separados por vírgula, mas o uso com espaços é o que este curso precisa agora.

Com a frase quebrada em lista, todo o arsenal do módulo 10 se aplica: dá para percorrer as palavras com for, pegar a primeira com palavras[0], verificar se uma palavra existe com in. É essa ponte entre texto e lista que torna o .split() um dos métodos mais usados do Python.

Juntando de volta com join

Se o .split() desmonta, alguém precisa montar de volta. Esse alguém é o .join(), e a sintaxe dele costuma causar estranheza no primeiro contato, então vale olhar com calma: quem chama o método é a string separadora, e a lista vai dentro dos parênteses. " ".join(palavras) significa: pegue os itens da lista palavras e cole um no outro usando um espaço entre cada par.

palavras = ["João", "da", "Silva"]

print(" ".join(palavras))    # João da Silva
print("-".join(palavras))    # João-da-Silva
print("".join(palavras))     # JoãodaSilva (cola sem separador)

A string antes do ponto é a cola. Mudou a cola, mudou o resultado.

Por que a ordem é essa, com a cola na frente? Porque o .join() é um método de string, e a cola é a string; a lista é só o ingrediente. Estranho no início, lógico depois. O que importa é o ciclo completo que você fecha nesta aula: uma frase entra, o .split() quebra em palavras, o seu código trabalha na lista (filtra, corrige, capitaliza), e o " ".join() entrega a frase reconstruída. Esse ciclo quebrar, transformar, juntar é o esqueleto exato da prática que fecha o módulo, o formatador de nomes.

E é só isso de .join() que o curso básico precisa: juntar palavras com espaço, ou com outro separador simples. Mergulhos mais fundos, como juntar números (que exigem conversão antes) ou montar arquivos com quebras de linha, aparecem na hora certa da trilha.

Teste rápido

Qual expressão conta corretamente as palavras de frase = "bom dia, Brasil"?

Perguntas frequentes

O len() conta letras acentuadas como um caractere só?
No uso normal do Python 3, sim: len("ação") devolve 4, porque a string é Unicode e cada letra acentuada é um caractere. Existem casos exóticos com emojis e acentos decompostos em que a conta surpreende, mas nada disso aparece nos programas deste curso.
Por que "João da Silva".split() não devolve strings vazias com espaços duplos?
Porque o .split() sem argumento trata qualquer sequência de espaços em branco como um único separador e ignora as pontas. Esse comportamento especial só existe na chamada sem argumento; com separador explícito, como .split(" "), espaços duplicados geram strings vazias na lista. Para palavras, use sempre a versão sem argumento.
Contar espaços com .count(" ") e somar 1 não daria o número de palavras?
Só numa frase perfeitamente limpa, com um espaço entre cada palavra e nenhum nas pontas. Um espaço duplo ou um espaço final quebram a conta. O len(texto.split()) é imune a essa bagunça, por causa do comportamento tolerante do split sem argumento, e por isso é o jeito certo.
Por que o separador vem antes do .join() e não dentro dele?
Porque o .join() é um método do tipo string, e quem o possui é o separador. O desenho tem uma vantagem: o mesmo método funciona com qualquer lista, sem que o tipo lista precise conhecer strings. Depois do estranhamento inicial, a leitura flui: cola.join(pedacos).
O que acontece se a lista do .join() tiver números?
Erro na hora, TypeError: o .join() só aceita strings na lista. Se houver números, converta antes, item a item, com str(). É diferente da f-string, que converte sozinha. Neste curso, as listas que você vai juntar são de palavras, então o problema não aparece; só não se assuste se topar com ele em testes seus.
Dá para usar len() para validar tamanho de senha ou de nome?
Dá, e é uso clássico: if len(senha) < 8 rejeita senhas curtas, if len(nome.strip()) == 0 rejeita nome em branco. Validar entrada com len() combina tudo que o módulo ensinou: limpar com strip, medir com len e decidir com if. O projeto final usa essa checagem nas tarefas.

Fontes

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