Laço while
Esta aula aborda o laço while em Python, incluindo seu uso com condições, as instruções break e continue, a cláusula else em loops e como evitar loops infinitos. O conteúdo é voltado para alunos intermediários, com exemplos práticos e exercícios.
O laço while é uma estrutura de repetição fundamental em Python que executa um bloco de código enquanto uma condição booleana for verdadeira. Diferentemente do for, que itera sobre uma sequência, o while é ideal quando não sabemos antecipadamente o número de iterações, dependendo de uma condição que pode ser alterada dentro do loop. Nesta aula, exploraremos suas nuances, como controle de fluxo com break e continue, o uso do else em loops e os cuidados para evitar loops infinitos.
O domínio do while é essencial para implementar algoritmos como menus interativos, validação de entrada, jogos e processos que exigem repetição até que uma condição seja satisfeita. Veremos cada aspecto com exemplos práticos.
Condições
A condição em um while é uma expressão booleana avaliada antes de cada iteração. Se for True, o bloco é executado; se for False, o loop termina. A condição pode ser qualquer expressão que retorne um valor booleano, como comparações, operadores lógicos ou até mesmo uma variável booleana.
É importante que a condição se torne falsa em algum momento, caso contrário teremos um loop infinito. Geralmente, alteramos uma variável de controle dentro do loop. Exemplo:
contador = 0
while contador < 5:
print(f"Contador: {contador}")
contador += 1
Nesse caso, a variável contador é incrementada a cada iteração, eventualmente atingindo 5, quando a condição se torna falsa. O output será:
Contador: 0
Contador: 1
Contador: 2
Contador: 3
Contador: 4
Condições mais complexas podem combinar operadores lógicos, como and, or e not. Por exemplo:
x = 10
while x > 0 and x % 2 == 0:
print(x)
x -= 2
Isso imprimirá 10, 8, 6, 4, 2. Quando x se torna 0, a condição falha.
break e continue
As instruções break e continue permitem controle mais fino sobre a execução do loop. break encerra o loop imediatamente, independentemente da condição. continue pula o restante do bloco atual e vai para a próxima iteração (avaliando a condição novamente).
Exemplo com break: um loop que busca um número específico:
numeros = [1, 3, 5, 7, 9]
procurado = 5
i = 0
while i < len(numeros):
if numeros[i] == procurado:
print(f"Encontrado na posição {i}")
break
i += 1
else:
print("Não encontrado")
Quando encontra o 5, o break interrompe o loop. O else aqui só seria executado se o loop terminasse sem break (veremos na próxima seção).
Exemplo com continue: pular números pares em um loop de 0 a 9:
i = 0
while i < 10:
i += 1
if i % 2 == 0:
continue
print(i)
Isso imprime apenas números ímpares: 1,3,5,7,9. Note que o continue faz com que o print seja ignorado para números pares.
else em loops
Python permite uma cláusula else após um loop while (ou for). O bloco else é executado quando o loop termina normalmente, ou seja, quando a condição se torna falsa. Se o loop for interrompido por um break, o else não é executado.
Isso é útil para situações em que queremos saber se o loop foi concluído sem interrupção, como em buscas. Exemplo:
senha_correta = "1234"
tentativas = 0
while tentativas < 3:
senha = input("Digite a senha: ")
if senha == senha_correta:
print("Acesso concedido")
break
tentativas += 1
else:
print("Conta bloqueada")
Se o usuário acertar a senha, o break é executado e o else é ignorado. Se esgotarem as tentativas, o loop termina naturalmente e o else informa o bloqueio.
Outro exemplo: verificar se um número é primo usando while e else:
n = 29
divisor = 2
while divisor < n:
if n % divisor == 0:
print(f"{n} não é primo, divisível por {divisor}")
break
divisor += 1
else:
print(f"{n} é primo")
Se encontrar um divisor, break interrompe; caso contrário, o else confirma que é primo.
Loops infinitos
Um loop infinito ocorre quando a condição do while nunca se torna falsa. Isso pode ser intencional (como em um servidor que fica ouvindo requisições) ou um erro de lógica. Exemplo de loop infinito acidental:
x = 0
while x < 10:
print(x)
# esqueci de incrementar x
Para interromper um loop infinito, podemos usar break ou combinar com uma condição interna. Exemplo de loop infinito controlado:
while True:
comando = input("Digite 'sair' para encerrar: ")
if comando == 'sair':
break
print(f"Você digitou: {comando}")
Loops infinitos intencionais são comuns em sistemas que precisam rodar continuamente até um sinal de parada. É importante garantir que haja uma condição de saída, como um break ou uma exceção.
Para evitar loops infinitos acidentais, sempre verifique se a variável de controle está sendo atualizada corretamente dentro do loop. Use também um contador de segurança em desenvolvimento:
max_iter = 1000
contador = 0
while contador < max_iter:
# lógica
contador += 1
else:
print("Loop encerrado por segurança")
Boas práticas e observações finais
Ao usar while, prefira que a condição seja clara e simples. Evite condições muito complexas; se necessário, use variáveis auxiliares. Lembre-se de que o while pode ser menos eficiente que o for quando o número de iterações é conhecido, mas é mais flexível para casos gerais. Sempre teste seus loops com entradas que possam causar loops infinitos. Em Python, loops infinitos podem travar o programa, então use break ou interrupção manual (Ctrl+C) durante o desenvolvimento.
Referências
- Documentação oficial: while
- Tutorial Python: break, continue e else em loops
- Real Python: Python while loop
- W3Schools: Python While Loops
- Programiz: Python while Loop
- Stack Overflow: perguntas sobre while em Python
Exercícios
Escreva um programa que use um laço
whilepara somar todos os números de 1 a 100 e exiba o resultado.✓ Resposta:soma = 0 i = 1 while i <= 100: soma += i i += 1 print(f"Soma: {soma}")Faça um programa que peça ao usuário para digitar números até que ele digite 0. Ao final, exiba a média dos números digitados (excluindo o 0).
✓ Resposta:soma = 0 quantidade = 0 while True: numero = float(input("Digite um número (0 para sair): ")) if numero == 0: break soma += numero quantidade += 1 if quantidade > 0: media = soma / quantidade print(f"Média: {media:.2f}") else: print("Nenhum número foi digitado.")Usando
whileecontinue, escreva um programa que exiba apenas os números ímpares de 1 a 20.✓ Resposta:i = 0 while i < 20: i += 1 if i % 2 == 0: continue print(i)Crie um programa que use
whilecomelsepara verificar se um número fornecido pelo usuário é primo. O programa deve pedir um número inteiro positivo e exibir se é primo ou não.✓ Resposta:n = int(input("Digite um número inteiro positivo: ")) if n <= 1: print("Não é primo") else: divisor = 2 while divisor < n: if n % divisor == 0: print(f"{n} não é primo, divisível por {divisor}") break divisor += 1 else: print(f"{n} é primo")Escreva um programa que simule um menu interativo usando um loop infinito com
while Trueebreak. O menu deve ter as opções: 1 - Saudação, 2 - Despedida, 3 - Sair. Ao escolher 3, o programa termina.✓ Resposta:while True: print("\nMenu:") print("1 - Saudação") print("2 - Despedida") print("3 - Sair") opcao = input("Escolha uma opção: ") if opcao == '1': print("Olá!") elif opcao == '2': print("Tchau!") elif opcao == '3': print("Encerrando...") break else: print("Opção inválida. Tente novamente.")