Capítulo 16, Básico
Laços com while
Use `for` quando você sabe o que vai percorrer e `while` quando você só sabe a condição de parada.
Código deste capítulo: basico/cap16_laco_while.py
while
O while repete enquanto a condição for verdadeira. A condição precisa, em algum momento, virar falsa, caso contrário o programa nunca termina:
contagem = 3
while contagem > 0:
print(contagem)
contagem -= 1
print("Fogo!")
3
2
1
Fogo!
Laço infinito
Se você esquecer de atualizar a variável da condição, o programa fica preso para sempre. No terminal,
Ctrl+Cinterrompe. Antes de rodar umwhile, pergunte: o que muda a cada volta e faz a condição virar falsa?
while True com break
Quando você não sabe quantas vezes vai repetir, o padrão while True com um break na saída é o mais claro. Ele é o jeito certo de validar entrada:
while True:
texto = input("Digite um número positivo: ")
if texto.isdigit() and int(texto) > 0:
break
print("Valor inválido, tente de novo.")
print(f"Você digitou {int(texto)}")
Digite um número positivo: abc
Valor inválido, tente de novo.
Digite um número positivo: -3
Valor inválido, tente de novo.
Digite um número positivo: 42
Você digitou 42
Dígitos de um número
A combinação de while com divmod(n, 10) extrai um dígito por vez, do último para o primeiro. É a base de somar dígitos, inverter números e testar palíndromos numéricos:
numero = 1234
while numero > 0:
numero, digito = divmod(numero, 10)
print(digito)
4
3
2
1
original = 12345
invertido = 0
while original > 0:
original, digito = divmod(original, 10)
invertido = invertido * 10 + digito
print(invertido)
54321
Um jogo de adivinhação
O módulo random sorteia números. O randint(1, 100) inclui os dois extremos:
import random
print(random.randint(1, 100) in range(1, 101))
True
No jogo abaixo eu fixei o segredo em 63 para a saída ser previsível. Troque por random.randint(1, 100) para jogar de verdade:
segredo = 63
tentativas = 0
while True:
palpite = int(input("Seu palpite: "))
tentativas += 1
if palpite < segredo:
print("Muito baixo")
elif palpite > segredo:
print("Muito alto")
else:
print(f"Acertou em {tentativas} tentativas")
break
Seu palpite: 50
Muito baixo
Seu palpite: 75
Muito alto
Seu palpite: 63
Acertou em 3 tentativas
Exercício 1
Soma dos dígitos
Escreva soma_digitos(n) com while. Para 1234 o resultado é 10.
Exercício 2
Conjectura de Collatz
Parta de n. Se for par, divida por 2. Se for ímpar, multiplique por 3 e some 1. Conte quantos passos levam até 1. Escreva collatz(n).