while ou for?
Os dois repetem código. A diferença é quem controla a repetição: no for, o Python cuida de tudo; no while, você cuida.
A regra para escolher
Você sabe quantas voltas antes de começar?Use for quando
você sabe antes de começar quantas voltas vão ser: de 1 a N, N notas, os números de quatro algarismos, a tabuada.
Use while quando
a quantidade de voltas depende do que acontece durante o laço: até digitar zero, até o sapo sair, enquanto sobrar algarismo.
Na prova: o professor prefere while e não aceita break. Então aprenda os dois, mas escreva while na prova. O for aparece aqui para você entender a diferença e reconhecer quando alguém usar.
Um vira o outro
As três responsabilidades do while viram os três números do rangeSomar de 1 até n
n = 5soma = 0for i in range(1, n + 1):soma = soma + iprint(soma)
n = 5soma = 0i = 1while i <= n:soma = soma + ii = i + 1print(soma)
- 1
i = 1é onde começa: o primeiro número do range. - 2
i <= né até onde vai: o segundo número do range. Como o range para um antes do fim,i <= nvirarange(…, n + 1). - 3
i = i + 1é de quanto em quanto anda: o terceiro número. Quando é 1, pode ser omitido.
Laboratório de range
Mude os números e veja o que o range gerafor i in range(1, 10, 2):print(i)
i = 1while i < 10:print(i)i = i + 2
Repare: o fim (10) nunca aparece na lista. É por isso que “de 1 até N” vira range(1, N + 1).
Quando o for não serve
A quantidade de voltas é desconhecida| Situação | Por que só o while |
|---|---|
| Percorrer dígitos | Você não sabe quantos algarismos o número tem. Para usar for teria que converter em texto (len(str(n))), o que o professor não aceita. |
| Senha de parada | “Leia até digitar zero”: ninguém sabe quantos números virão. Só o while, com leitura antes do laço e no fim dele. |
| Simular até acontecer | Sapo no poço, Collatz, Chico e Juca: a quantidade de voltas é justamente a resposta. Não dá para saber antes. |
| Parar ao encontrar | Com for, parar no meio exige break. Sem break, o jeito é while com a condição composta: while i <= n and not achou. |
Família por família
Qual laço é mais natural em cada família de fichas| Família | Mais natural | Na prova | Por quê |
|---|---|---|---|
| Percorrer dígitos | while | while | Você não sabe quantos algarismos o número tem, então repete enquanto sobrar número. |
| Percorrer divisores | for | while | Você sabe de antemão o intervalo a testar (de 1 até n), então a quantidade de voltas é conhecida. |
| Acumular com contador | for | while | A quantidade de voltas é dada pelo próprio enunciado (N vezes). |
| Varrer um intervalo | for | while | Começo e fim são conhecidos: é exatamente o que o range descreve. |
| Decidir por condições | sem laço | sem laço | Não há repetição: o programa decide uma vez e termina. |
| Repetir até uma condição | while | while | A quantidade de voltas depende do que acontece durante o laço: só o while serve. |
| Laço dentro de laço | cada laço o seu | while | Cada laço segue a regra da sua própria família: um pode ser for e o outro while. |
| Listas | while | while | Para percorrer pela posição, o índice vai de 0 até len(lista) − 1. O for x in lista também serve quando você só precisa dos valores, não das posições. |
| Tuplas | for | while | A tupla tem tamanho fixo e conhecido: o for passa por todos os valores. O while com índice também funciona, igual na lista. |
| Funções | cada laço o seu | while | A função em si não é laço: dentro dela vale a regra de sempre, while quando não se sabe quantas voltas, for quando se sabe. |
| Dicionários | for | while | O dicionário não tem posições 0, 1, 2: o for passa direto pelas chaves (ou pelos pares, com .items()). Para usar while, primeiro faça uma lista das chaves: chaves = list(d.keys()), e ande nela pelo índice. |
Parar sem break
O motivo da parada pertence à condição do whilen = 91achou = Falsei = 2while i < n and not achou:if n % i == 0:achou = Truei = i + 1print(achou, i - 1)
Para ao encontrar o primeiro divisor (o 7): a condição do while olha o achou a cada volta.
Quem usa break está escondendo dentro do laço uma informação que deveria estar no topo dele. E nunca comece com while True: esse laço só sai com break.
Erros que mais aparecem na prova
5 errosrange(1, n) para “de 1 até n”
O fim do range nunca entra. Para incluir o n, o fim é n + 1.
Esquecer de andar a variável no while
Sem i = i + 1, a condição nunca muda e o laço não termina.
while True com break
O professor não aceita. A condição de parada vai no próprio while.
Mudar a variável do for dentro do laço
No for, o Python escolhe o próximo valor sozinho: mudar i lá dentro não pula voltas.
for para percorrer dígitos
Exige converter o número em texto, o que anula a questão. Dígitos são com while n > 0.