- Refaça o código abaixo de modo que o while não use o break.
while True:
line = input('> ')
if line == 'done':
break
print(line)
print('Done!')
while True:
line = input('> ')
if line == 'done':
break
print(line)
print('Done!')Passo 1
O enunciado pede para reescrever um pequeno programa Python que lê linhas do teclado e termina quando o usuário digita a palavra
'done', mas a nova versão não pode usar o comando break. As informações dadas no código original são:- O programa lê repetidamente usando
input('> '). - Se a linha lida for
'done', o programa termina. - Para qualquer outra linha, o programa imprime a linha lida.
- Ao final (quando termina), o programa imprime
'Done!'.
Passo 2
Entendendo o que
break faz aqui e qual alternativa queremos:- No código original,
while True:cria um laço infinito ebreaké usado para sair quando a condição de parada (line == 'done') acontece. - Uma alternativa clássica ao uso de
breaké transformar a condição de parada em parte da condição dowhile. Ou seja, fazer owhileverificar se ainda devo continuar (por exemplo,while line != 'done':). - Para isso funcionar, preciso ter o valor inicial de
lineantes dowhile. Esse padrão chama-se “priming read” (leitura inicial) — leio uma vez antes do laço, e depois dentro do laço leio novamente no final para atualizar a condição.
Passo 3
Explicando passo a passo a versão com “priming read”:
- Faço uma primeira leitura com
line = input('> '). Assim tenho uma primeira linha para avaliar. - Entro no
whilecuja condição éline != 'done'. Enquanto a linha lida for diferente de'done', o laço continua. - Dentro do
while, imprimo aline(porque está autorizada a ser exibida). - Também dentro do
while, faço outra leituraline = input('> ')para atualizar a variável e decidir se o laço continua ou para na próxima verificação. - Quando o usuário digitar
'done', a condiçãoline != 'done'falha e owhileencerra naturalmente sem usarbreak. - Fora do laço, imprimo
print('Done!')para indicar que terminou.
Detalhes práticos:
input()sempre retorna uma string; por isso dá para comparar direto com'done'.- É importante atualizar
linedentro dowhilepara evitar um laço infinito. - Esse é o jeito mais simples e direto para evitar
break.
Passo 4
Vou mostrar o código final desta solução (usei a técnica de priming read explicada acima). Esse código tem comportamento idêntico ao original, mas não usa
break.Passo 5
Como bônus (opcional), existe outra solução sem
break usando uma variável booleana de controle:- Inicializo
finished = False. - Uso
while not finished:, leioline = input('> '). - Se
line == 'done'entãofinished = True, senãoprint(line). - Fora do laço,
print('Done!').
Essa técnica também evitabreake pode ser útil quando a condição de parada é mais complexa.
Resposta
line = input('> ')
while line != 'done':
print(line)
line = input('> ')
print('Done!')