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

Exercícios

  1. Escreva um programa que use um laço while para 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}")
    
  2. 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.")
    
  3. Usando while e continue, 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)
    
  4. Crie um programa que use while com else para 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")
    
  5. Escreva um programa que simule um menu interativo usando um loop infinito com while True e break. 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.")