Um laço que vigia uma condição
Onde o for itera sobre uma sequência conhecida, o while continua repetindo enquanto uma condição for verdadeira. Você recorre a ele quando não sabe de antemão quantas iterações vai precisar — tentar de novo até funcionar, ler entrada até o usuário mandar parar, consultar um serviço até ele responder.
O formato é simples:
Isso imprime de 0 a 4. O Python checa a condição no topo de cada iteração. Se é verdadeira, o corpo roda. Depois checa de novo. Quando a condição fica falsa, o laço termina.
Repare que count += 1 importa. Sem isso, a condição ficaria verdadeira para sempre — um loop infinito. Essa é a principal armadilha do while, e a principal razão para preferir for quando puder.
Quando while é a ferramenta certa
Alguns casos de uso clássicos:
Tentar até dar certo.
Ler entrada até o usuário sair.
Processar uma fila.
O fio comum: você está vigiando uma mudança de estado em vez de iterar sobre itens.
while True é ok
Você vai ver esse padrão com frequência:
Isso é Python idiomático quando a condição de saída "real" está dentro do corpo do laço, não algo limpo que dá para testar no topo. É mais fácil de ler do que inventar uma flag should_continue que você atualiza num lugar e checa em outro.
A única regra: garanta que existe um break (ou return, ou uma exceção lançada) que o código eventualmente alcance. Um while True: incondicional sem saída é o jeito clássico de travar um programa.
Evitando o loop infinito
Loops infinitos acontecem quando a condição fica verdadeira para sempre. Os suspeitos de sempre:
- Esqueceu de atualizar a variável.
while count < 5:precisa de algo dentro do corpo que mudacount. - Atualizou a variável errada.
while i < 10:e depoisj += 1por dentro — fácil de não perceber se seu código tem mais de algumas variáveis. - Comparação de ponto flutuante.
while x != 1.0:pode rodar para sempre sexsó chega perto de 1.0. Use<=ouabs(x - 1.0) < tolerancia.
Se acabar travado num loop infinito num terminal, aperte Ctrl+C. Isso manda um sinal de interrupção e o Python para o que estiver fazendo.
break, continue e else
while suporta as mesmas três ferramentas de "fluxo" que o for:
breaksai do laço imediatamente.continuepula para a próxima iteração (então a condição é checada de novo).elseroda se o laço terminar sem umbreak.
Isso é um teste primitivo de primalidade. Se o break interno dispara, o número é composto. Se o laço sai naturalmente (condição fica falsa), o else roda e declara o número primo.
while vs for: qual escolher?
Um teste mental rápido:
- Você tem uma coleção para percorrer? →
for. - Precisa iterar um número fixo de vezes? →
for i in range(n):. - Está em laço até alguma condição mudar? →
while.
Em Python de início, você vai achar que for cobre 90% dos laços. while aparece quando você está fazendo algo como polling, retry ou construindo um REPL simples. Se você está usando while para iterar sobre uma lista com índice, isso é sinal de que deveria mudar para for + enumerate.
Um programa prático com while
Um jogo de adivinhar número é um exemplo clássico porque o número de iterações depende de como o usuário joga:
Você não pode saber de antemão quantas tentativas vai levar — depende dos palpites do usuário. É exatamente para isso que o while existe.
Olhando adiante
Você já viu os dois tipos de laços que o Python te dá. Na próxima: range() em detalhe — aparece em quase todo laço for de contagem, e as pequenas nuances valem entender antes de irmos para coleções.
Perguntas frequentes
Quando devo usar um laço while em vez de for?
Use while quando você não sabe de antemão quantas iterações vai precisar — por exemplo, tentar de novo até algo dar certo, ou ler entrada até o usuário digitar 'sair'. Use for quando está passando por uma coleção conhecida.
Como evito um loop infinito em Python?
Garanta que algo dentro do laço eventualmente torne a condição falsa. A causa mais comum de loops infinitos é esquecer de atualizar a variável da qual a condição depende. Se ficar preso num, aperte Ctrl+C no terminal para parar.
while True é má prática?
while True é má prática?Não inerentemente. while True: com um break claro por dentro é um padrão perfeitamente normal para "loop até a gente bater numa condição de saída específica". É mais limpo do que inventar uma flag booleana que você tem que gerenciar em dois lugares.