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. Diferente do for, que itera sobre uma sequência, o while é mais flexível e adequado para situações onde o número de iterações não é conhecido antecipadamente. Nesta aula, exploraremos suas principais características, controle de fluxo e boas práticas.

Dominar o while é essencial para escrever programas que interagem com o usuário, processam dados até uma condição de parada ou implementam algoritmos como busca binária e simulações. Veremos como usar condições, interromper loops com break, pular iterações com continue, utilizar a cláusula else e evitar loops infinitos.

Condições

A condição em um laço while é uma expressão booleana que é 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, incluindo comparações, operadores lógicos e chamadas de função.

É importante que a condição eventualmente se torne falsa para evitar loops infinitos. Geralmente, modificamos variáveis dentro do loop que afetam a condição. Exemplo:

contador = 0
while contador < 5:
    print(f"Iteração {contador}")
    contador += 1

Neste exemplo, a condição contador < 5 é verdadeira enquanto contador for menor que 5. A cada iteração, incrementamos contador, até que a condição se torne falsa.

break e continue

O comando break interrompe imediatamente o laço, independentemente da condição. É útil para sair de um loop quando uma condição especial é encontrada. Já o continue pula o restante do bloco atual e volta para o teste da condição.

Exemplo com break:

while True:
    entrada = input("Digite 'sair' para encerrar: ")
    if entrada == 'sair':
        break
    print(f"Você digitou: {entrada}")

Exemplo com continue:

numero = 0
while numero < 10:
    numero += 1
    if numero % 2 == 0:
        continue
    print(numero)  # imprime apenas ímpares

No primeiro exemplo, o loop é infinito (while True) até que o usuário digite "sair", que aciona o break. No segundo, números pares são pulados com continue.

else em loops

Python permite uma cláusula else em loops while (e for). O bloco else é executado quando a condição do loop se torna falsa, mas não se o loop foi interrompido por um break. Isso é útil para verificar se o loop foi concluído normalmente.

Exemplo:

numero = 0
while numero < 5:
    print(numero)
    numero += 1
else:
    print("Loop concluído sem interrupção.")

Se um break ocorrer, o else não executa:

numero = 0
while numero < 5:
    if numero == 3:
        break
    print(numero)
    numero += 1
else:
    print("Isso não será impresso.")

O else é frequentemente usado em buscas: se encontrarmos o elemento, damos break; caso contrário, o else indica que não foi encontrado.

Loops infinitos

Um loop infinito ocorre quando a condição nunca se torna falsa. Isso pode ser intencional (como em servidores ou jogos) ou acidental (bug). Para loops infinitos intencionais, usa-se while True combinado com break para sair sob condição.

Exemplo de loop infinito acidental:

x = 10
while x > 0:
    print(x)
    # esqueci de decrementar x

Para interromper um loop infinito no terminal, use Ctrl+C (interrupção do teclado). Boas práticas: sempre garantir que a condição seja atualizada dentro do loop, e evitar condições que nunca mudam.

Boas práticas e observações finais

Prefira for quando o número de iterações é conhecido ou quando iterar sobre uma coleção. Use while para repetições baseadas em condições. Evite loops infinitos acidentais verificando se a condição pode se tornar falsa. Use break com moderação; muitas vezes é possível reescrever o loop com uma condição mais clara. A cláusula else é um recurso poderoso para tratar a conclusão normal do loop.

Referências

Exercícios

  1. Escreva um programa que use um laço while para imprimir os números de 1 a 10.

    ✓ Resposta:
    num = 1
    while num <= 10:
        print(num)
        num += 1
    
  2. Crie um programa que peça ao usuário para adivinhar um número secreto (por exemplo, 7). Use um laço while que continua até o usuário acertar. Use break para sair quando acertar.

    ✓ Resposta:
    secreto = 7
    while True:
        palpite = int(input("Adivinhe o número (1-10): "))
        if palpite == secreto:
            print("Parabéns! Você acertou.")
            break
        else:
            print("Tente novamente.")
    
  3. Use um laço while com continue para imprimir apenas os números ímpares de 1 a 20.

    ✓ Resposta:
    num = 0
    while num < 20:
        num += 1
        if num % 2 == 0:
            continue
        print(num)
    
  4. Escreva um programa que use um laço while com else para percorrer uma lista de números e verificar se o número 5 está presente. Se encontrar, imprima "Encontrado" e interrompa; senão, após o loop, imprima "Não encontrado".

    ✓ Resposta:
    lista = [1, 2, 3, 4, 6, 7]
    i = 0
    while i < len(lista):
        if lista[i] == 5:
            print("Encontrado")
            break
        i += 1
    else:
        print("Não encontrado")
    
  5. Explique como evitar um loop infinito acidental. Dê um exemplo de código que causa um loop infinito e a correção.

    ✓ Resposta:

    Para evitar loops infinitos, certifique-se de que a condição do loop pode se tornar falsa. Isso geralmente envolve modificar uma variável dentro do loop que é usada na condição. Exemplo de loop infinito:

    x = 10
    while x > 0:
        print(x)
        # falta x -= 1
    

    Correção:

    x = 10
    while x > 0:
        print(x)
        x -= 1