Olá Pedro.
O uso de is no seu código está conceitualmente errado, embora em alguns casos pareça funcionar.
O operador is compara identidade, ou seja, verifica se duas variáveis apontam para o mesmo objeto na memória.
Já o operador == compara igualdade de valor, verificando apenas se o conteúdo é igual.
Quando você escreve:
if livro is "O Hobbit":
pode ocorrer de funcionar porque o Python faz interning de algumas strings literais, armazenando-as de forma otimizada.
Nesse caso, a mesma string pode acabar sendo reutilizada internamente.
Porém, isso não é garantido e pode falhar em diferentes situações, como strings longas, criadas dinamicamente ou recebidas como entrada do usuário.
Por isso, a forma correta e segura é:
if livro == "O Hobbit":
Isso garante que você está comparando os valores, que é o comportamento desejado.
Código corrigido:
print('Usando o Break\n')
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
Para ilustrar a diferença entre is e ==, veja este exemplo:
a = "O Hobbit"
b = "".join(["O ", "Hobbit"])
print(a == b) # True (mesmo conteúdo)
print(a is b) # False (objetos diferentes)
O operador is só deve ser usado quando se deseja verificar identidade, como em comparações com None:
if x is None:
...
Para comparar valores, como no caso de strings, deve-se usar ==.
Continue explorando as muitas possibilidades e testando os resultados.
E na duvida pergunte sempre.
Bons estudos.