1
resposta

[Projeto] Identificando palavras mais longas em um texto

def palavras_contradas():
    texto = input('Digite um texto: ')
    palavras_longas = []
    for palavra in texto.split():
        if len(palavra) > 10:
            palavras_longas.append(palavra)
    if palavras_longas:
        print('Palavras longas encontradas: ')
        for palavra in palavras_longas:
            print(palavra)
    else:
        print('Nenhuma palavra longa foi encontrada no texto.',','.join(palavras_longas))
        
palavras_contradas()
1 resposta

Olá, Apollo. Como vai?

Parabéns por concluir mais este desafio! O seu código está muito bem estruturado e a lógica de separar as palavras de uma frase usando o método .split() foi aplicada perfeitamente.

Gostaria de destacar alguns pontos muito positivos na sua solução:

  • Uso correto do .split(): Esse método é essencial para quebrar uma frase inteira em uma lista de palavras individuais usando os espaços em branco como separadores.
  • Validação de tamanho com len(): A verificação de tamanho utilizando len(palavra) > 10 atende com precisão ao que foi proposto no desafio.
  • Preocupação com a experiência do usuário: O seu código trata muito bem os dois cenários possíveis (quando existem palavras longas e quando nenhuma é encontrada).

Analisando o comportamento do seu script, há um detalhe muito importante sobre a lógica do bloco else que pode causar um comportamento inesperado (um loop infinito) e um pequeno bug na exibição. Vamos analisar juntos como ajustar:

O comportamento do laço recursivo no else

Dentro do bloco else, você adicionou a linha palavras_contradas(), que faz com que a função chame a si mesma caso nenhuma palavra longa seja encontrada. Isso é conhecido na programação como recursividade.

O problema é que se o usuário errar consecutivas vezes ou digitar um texto curto novamente, o Python continuará acumulando essas chamadas na memória do computador. Se isso acontecer muitas vezes, o programa travará apresentando um erro chamado RecursionError. Para resolver isso, o ideal é controlar as tentativas do usuário utilizando um laço de repetição tradicional (while).

Além disso, na linha do print do else, você tentou usar o ','.join(palavras_longas). Como o código só entra no else se a lista estiver vazia, esse comando vai tentar juntar elementos de uma lista vazia, exibindo apenas um espaço em branco no final da frase.

Como o código fica aplicando as boas práticas

Para deixar a sua função limpa, performática e evitar problemas de memória, o ideal é fazer a função retornar a lista de palavras encontradas (separando a lógica de processamento da lógica de exibição). Veja como estruturar o seu código seguindo as melhores práticas de mercado:

def identificar_palavras_longas(texto):
    """Função focada apenas em processar o texto e retornar uma lista."""
    palavras_longas = []
    for palavra in texto.split():
        # Dica extra: limpando pontuações como vírgulas e pontos grudados na palavra
        palavra_limpa = palavra.strip(',.!?;"')
        if len(palavra_limpa) > 10:
            palavras_longas.append(palavra_limpa)
    return palavras_longas

# Fluxo principal do programa utilizando um laço while seguro
while True:
    entrada_usuario = input('Digite um texto (ou "sair" para encerrar): ')
    
    if entrada_usuario.lower() == 'sair':
        print("Programa encerrado.")
        break
        
    resultado = identificar_palavras_longas(entrada_usuario)
    
    if resultado:
        print('\nPalavras longas encontradas (mais de 10 caracteres):')
        for palavra in resultado:
            print(f"- {palavra}")
        break # Encerra o loop após encontrar com sucesso
    else:
        print('Nenhuma palavra longa foi encontrada no texto. Tente novamente.\n')

O que mudou e por que ficou melhor?

  • Tratamento de Pontuação: Adicionamos o .strip(',.!?;"'). Sem isso, se o usuário digitasse uma palavra de 10 letras no final da frase seguida de um ponto final (ex: "vestuário."), o Python contaria o ponto final como caractere, totalizando 11 e gerando um falso positivo.
  • Laço while True: Substituiu a chamada recursiva. Agora o usuário pode tentar quantas vezes quiser sem risco de estourar a memória do computador.
  • Separação de Responsabilidades: A função agora faz apenas uma coisa (procura as palavras e retorna a lista). A exibição na tela com os prints ficou sob responsabilidade do fluxo principal do script.

Você está evoluindo muito rápido na criação de scripts com Python. Continue praticando essa quebra de problemas em blocos de funções!

Espero que possa ter lhe ajudado!