Laço for versus laço while em Python: quando usar cada um

Os dois laços repetem código, então quem está começando costuma se perguntar qual escolher. A regra prática: use um laço for quando você sabe o que vai percorrer, e um laço while quando está esperando algo mudar. Cada exemplo abaixo foi executado, e a saída mostrada é exata.

for com range: um número conhecido de vezes

range(3) gera 0, 1 e 2. A variável do laço assume cada valor por vez. O fim do range nunca é incluído.

for i in range(3):
    print(i)

Saída:

0
1
2

for sobre uma lista: cada item

Um laço for pode percorrer diretamente uma lista, uma string, um dicionário ou qualquer coisa que você consiga percorrer item por item. Você não precisa de um índice.

for part in ["wrench", "cable"]:
    print(part)

Saída:

wrench
cable

while: até que algo mude

Um laço while verifica a condição antes de cada volta. Algo dentro do laço precisa mudar essa condição, ou ele nunca para. Aqui a bateria cai 3 por vez até não sobrar o suficiente, e você não sabe de antemão o número de voltas.

battery = 10
steps = 0
while battery >= 3:
    battery -= 3
    steps += 1
print(steps)

Saída:

3

break e continue

break sai do laço imediatamente. continue pula o resto desta volta e passa para a próxima. Os dois funcionam tanto em laços for quanto em laços while.

for n in range(1, 8):
    if n % 2 == 0:
        continue
    if n > 5:
        break
    print(n)

Saída:

1
3
5

O laço infinito

Um laço while cuja condição nunca se torna falsa roda para sempre. Se o seu programa parecer travado, confira se a variável da condição realmente muda dentro do laço. Neste site, um programa que roda por mais de cinco segundos é interrompido para você.

Perguntas comuns

Todo laço for pode ser escrito como um laço while?
Sim, mas fica mais longo e mais fácil de errar, porque você mesmo controla o contador. Prefira for sempre que estiver percorrendo uma coleção ou um intervalo fixo.
Qual é a diferença entre break e continue?
break encerra o laço inteiro. continue apenas pula a volta atual e segue para a próxima.
Por que o meu laço while nunca termina?
A condição continua verdadeira porque nada dentro do laço muda a variável que ela testa. Adicione uma linha que a aproxime do fim, como n -= 1.

Pratique