2
respostas

Entendendo uso break

Gabarito:
livros = ["1984", "Dom Casmurro", "O Pequeno Príncipe", "O Hobbit", "Orgulho e Preconceito"]

for livro in livros:
if livro == "O Hobbit":
print(f"Livro encontrado: {livro}")
break

Dúvida: 1) Esse código do gabarito nao é funcional para o usuário final, tendo em vista que ele precisa de um meio para informar livro desejado e pelo que entendi do código, esse meio nao é fornecido. Öu seja, como o usuário daria entrada no livro desejado?

  1. Consegui resolver fazendo da seguinte forma, mas percebi 2 novas falhas:
    livro_desejado = input("Digite o nome do livro desejado: ")

livros = ["1984", "Dom Casmurro", "O Pequeno Príncipe", "O Hobbit", "Orgulho e Preconceito"]

for livro in livros:
if livro == livro_desejado:
print(f"Livro encontrado: {livro}")
break
else:
print("Livro não encontrado")

Com esse código, diferente do gabarito, resolvi a dúvida 1), mas o resultado "Livro não encontrado" é mostrado toda vez que o livro não corresponde ao digitado, e isso não é necessário. O objetivo é mostrar o nome do livro encontrado ou uma única vez o resultado "Livro não encontrado".

Outro problema é que o código é rígido ao não levar em consideracão que o usuário pode digitar o livro com erros de acentuacão ou ainda com letras maiúsculas ou minúsculas.

Como resolver, de modo que fique razoavelmente funcional para o usuário final?

2 respostas

Olá, Daniel! Como vai?

Suas observações são excelentes e demonstram que você já está pensando como um desenvolvedor: focando na experiência do usuário (UX) e na robustez do código.

O código do gabarito é um exemplo didático para isolar o funcionamento do break, mas, para um sistema real, ele realmente precisa das melhorias que você sugeriu. Vamos resolver ponto a ponto:

1. O problema do "Não encontrado" repetido

Isso acontece porque o seu else está dentro do laço for. Para resolver, usamos o for-else do Python. Esse else é especial: ele só executa se o laço terminar sem ter encontrado um break.

2. O problema da rigidez (Maiúsculas/Minúsculas)

Para resolver isso, usamos o método .lower() ou .strip(). Transformamos tanto o que o usuário digitou quanto o nome do livro na lista para minúsculas. Assim, "O HOBBIT" ou "o hobbit" serão identificados corretamente.


Código Refatorado e Funcional

Aqui está uma versão que resolve todos os seus pontos:

# 1. Entrada do usuário
livro_desejado = input("Digite o nome do livro desejado: ").strip().lower()

livros = ["1984", "Dom Casmurro", "O Pequeno Príncipe", "O Hobbit", "Orgulho e Preconceito"]

# 2. Busca com normalização
for livro in livros:
    # Comparamos os dois em minúsculo para evitar erros de digitação
    if livro.lower() == livro_desejado:
        print(f"Livro encontrado: {livro}")
        break  # Interrompe a busca imediatamente
else:
    # Esse bloco pertence ao FOR, não ao IF. 
    # Só executa se o break NUNCA for acionado.
    print("Desculpe, esse livro não consta em nossa biblioteca.")

Por que essa estrutura funciona melhor?

  • O break estratégico: No momento em que o livro é achado, o programa para de procurar. Se a lista tivesse 1 milhão de livros e o seu estivesse na posição 10, você economizaria muito processamento.
  • A "mágica" do for-else: É uma das ferramentas mais úteis do Python para buscas. Ele elimina a necessidade de criar variáveis de controle (como achou = False).
  • Normalização de dados: Usar .lower() é uma regra de ouro em programação. Sempre trate a entrada do usuário antes de compará-la com seu banco de dados.

Dica extra: Para erros de acentuação (como "Príncipe" vs "Principe"), a solução é um pouco mais avançada, usando uma biblioteca chamada unicodedata para remover os acentos da string antes da comparação. Por enquanto, focar no .lower() já resolve 90% das frustrações do usuário!

Continue com esse olhar crítico, Daniel. É isso que diferencia um programador que apenas "copia código" de um que constrói soluções reais.

Espero que possa ter lhe ajudado!

Excelente! Muito obrigado pela ajuda.