Curso de Python / Controlar a repetição com while, break e continue

Um laço while repete enquanto sua condição é verdadeira. break encerra o laço mais interno, e continue pula o restante da rodada atual; confira se cada caminho permite atualizar o estado necessário para o término.

Escolha uma repetição baseada em condição

Quando os itens já estão disponíveis, um for costuma expressar diretamente o percurso. Quando o programa precisa receber novas entradas ou repetir até que um estado mude, while pode ser adequado. A condição é testada antes de cada rodada; se for falsa desde o início, o bloco não será executado.

while True mantém a condição verdadeira e deixa o término depender de uma saída interna explícita, como break. Isso não é um erro por si só. O importante é que a regra de saída seja clara e alcançável. A referência da instrução while descreve o teste e o retorno provocado por continue.

Se a atualização de um contador ou de uma entrada ficar somente depois de continue, alguns caminhos podem sempre ignorá-la. Em um terminal, use Ctrl+C para interromper um laço que não termina e depois examine onde o estado é atualizado. Um cursor aguardando uma entrada, porém, pode significar apenas que input() está esperando você digitar.

Leia valores até receber o comando de saída

Salve o programa completo em UTF-8 como while_input.py e execute python while_input.py no terminal do ambiente selecionado. No macOS ou Ubuntu, fora de um ambiente virtual, use python3 se esse for o comando da instalação. Nenhum pacote ou arquivo externo é necessário.

total = 0
while True:
    text = input("amount or q: ").strip()
    if text == "q":
        break
    if text == "":
        continue
    amount = int(text)
    if amount < 0:
        print("skip negative")
        continue
    total += amount
print("total:", total)

No prompt amount or q:, que pede um valor ou o comando q, informe esta sequência, pressionando Enter a cada etapa:

  1. 3500
  2. Uma linha vazia, apenas pressionando Enter
  3. -1
  4. q

A saída escrita pelo programa, sem incluir os caracteres digitados, é:

amount or q: amount or q: amount or q: skip negative
amount or q: total: 3500

Um terminal interativo normalmente mostra também o que você digita. Por isso, a disposição das linhas pode parecer diferente da saída sem eco acima. A mensagem skip negative significa que o valor negativo foi ignorado, e a última linha confirma o total 3500.

Acompanhe o caminho de cada entrada

A cada rodada, input() recebe uma nova linha, e strip() remove os espaços nas extremidades. A comparação com "q" vem antes da conversão: quando o comando aparece, break sai do laço e a impressão final é executada.

Uma string vazia provoca continue, mas a próxima rodada volta à chamada de entrada. O programa não fica preso à mesma string vazia. Um valor negativo já convertido provoca a mensagem e outro continue, sem chegar a total += amount. Um inteiro não negativo é acrescentado ao total.

Esta versão pressupõe uma string que represente um inteiro ou o comando minúsculo q. abc e 8000.5 provocam ValueError, e o programa termina porque não há tratamento dessa conversão. Uma fonte de entrada que termine antes da próxima linha pode provocar EOFError. A referência de input() explica a leitura e o fim da entrada.

Se o programa precisar pedir novamente um valor inválido, trate especificamente a conversão com int() e a exceção esperada ValueError, mantendo a verificação de saída antes dela. Não transforme todo erro da aplicação em uma nova tentativa. A aula de entrada e conversão de texto ajuda a distinguir o que foi lido do valor numérico resultante.

Confira o alcance da saída e os casos de limite

Em laços aninhados, break encerra apenas o mais interno. Para sair de várias camadas, será necessário planejar um estado que os níveis externos verifiquem ou uma função que possa retornar. continue também atua somente no laço a que pertence. O tutorial de break e continue mostra esse alcance.

  1. Execute novamente e informe q como primeira entrada. O total deve ser 0.
  2. Teste 10, 20 e q. Confira o total 30.
  3. Teste 0 e depois q. O zero é uma string não vazia convertida em um inteiro válido; ele é processado, embora não aumente o total.
  4. Execute com Q maiúsculo. O comando atual não o reconhece e a conversão provoca ValueError. Se a regra permitir as duas formas, normalize explicitamente o comando antes de compará-lo.
  5. Volte à sequência original de quatro entradas e confirme o total 3500.

A repetição precisa manter uma forma evidente de terminar. Verifique tanto a condição quanto os caminhos que pulam etapas; não presuma que uma operação de atualização será executada só porque ela está escrita dentro do laço.