Curso de Python

Aula 14 - Estruturas de Repetição: while

Estruturas de Repetição: while

Os loops nos permitem executar uma instrução ou grupo de instruções quantas vezes quisermos. Em geral, as instruções são executadas sequencialmente. Vamos ver um exemplo muito ruim onde imprimimos diversas vezes 'Hello, World!':

exemplo_ruim.py
print('Hello, World!')
print('Hello, World!')
print('Hello, World!')
print('Hello, World!')
print('Hello, World!')

Esses comandos de prints são completamente desnecessários, porque o loop while pode simplificar tudo isso, reduzindo essas linhas de código. O que ele faz é repetir algum bloco de código enquanto (while) sua condição for verdadeira. Lembram muito as estruturas condicionais, não é? Mas a grande diferença é que as estruturas condicionais executam apenas uma vez o bloco de código se sua condição for verdadeira, enquanto as estruturas de repetição executam repetidas vezes um bloco de código. Vamos ver o exemplo mais simples possível:

Exemplo Básico de while

Queremos imprimir na tela 5 vezes 'Hello, World!'. O primeiro passo para a criação de um loop while é seu contador. Sempre terá que ter uma variável contadora ao utilizar o loop while. Pode ser de qualquer nome, desde que seja claro e significativo. Vamos utilizar neste exemplo uma variável contador, e atribuir o valor 1:

hello_while.py
contador = 1
while contador <= 5:
    print('Hello, World!')
    contador = contador + 1

O código acima executa 5 vezes o bloco de código 'Hello, World!'. A cada repetição, a variável contador aumenta em 1 até chegar a 6, quando o while para.

Contagem Crescente e Decrescente

Vamos criar um programa que repete 5 vezes o código 'Contagem: ...':

contagem_crescente.py
contador = 1
while contador <= 5:
    print(f'Contagem: {contador}')
    contador = contador + 1

E para contagem decrescente:

contagem_decrescente.py
contador = 5
while contador >= 1:
    print(f'Contagem: {contador}')
    contador = contador - 1

Quebrando e Continuando com break e continue

Há situações em que você precisa parar de executar um bloco de repetição while mesmo que a condição ainda não seja satisfeita. É possível fazer isso utilizando a palavra-chave break. Exemplo: repetir os números de 1 a 10, mas parar quando o contador for 7:

break.py
contador = 1
while contador <= 10:
    print(contador)
    if contador == 7:
        break
    contador = contador + 1

O continue serve para pular para a próxima repetição do loop. Exemplo: imprimir os números de 1 a 5, pulando o número 4:

continue.py
contador = 1
while contador <= 5:
    if contador == 4:
        contador = contador + 1
        continue
    print(contador)
    contador = contador + 1

Agora, um programa que pergunta ao usuário seu nome. O loop quebra apenas quando o usuário digitar 'quit':

input_quit.py
while True:
    nome = input("Digite o seu nome: ")
    if nome == 'quit':
        break

Tópicos Avançados

Substituição de 'contador' por 'i'

Muitos desenvolvedores usam a variável i ao invés de contador. Isso é uma convenção da comunidade:

i_convensao.py
i = 5
while i >= 1:
    print(i)
    i = i - 1

Operadores de Atribuição

Podemos usar operadores de atribuição para tornar o código mais compacto:

atribuicao.py
i = 1
while i < 5:
    print(i)
    i += 1  # Equivalente a i = i + 1

Loops Infinitos

Loops infinitos nunca param de executar, normalmente por esquecer de incrementar ou decrementar a variável de controle:

loop_infinito.py
# CUIDADO: Este código entra em loop infinito!
contador = 1
while contador < 10:
    print('Contando!')
    # contador = contador + 1  # Faltou incrementar!

Para resolver, basta não esquecer de incrementar:

loop_corrigido.py
contador = 1
while contador < 10:
    print('Contando!')
    contador = contador + 1

Estrutura while...else

Assim como as estruturas condicionais, o laço while também aceita else. O bloco else é executado quando a condição do while se torna falsa.

while_else.py
i = 1
while i <= 10:
    print(i)
    i += 1
else:
    print('As repetições acabaram')

Isso imprime os números de 1 a 10, e quando a condição do while for falsa, o else será executado, imprimindo "As repetições acabaram".