Laços de Repetição

Ao escrever código, você frequentemente encontra cenários onde precisa repetir a mesma ação — imprimir números de 1 a 100, processar cada elemento em uma lista, ou continuar perguntando ao usuário até obter uma resposta válida.

Escrever 100 linhas de print() para 100 números é impraticável. É aí que entram os laços. Python fornece dois tipos de laços:


Básico do for

O laço for é o mais comumente usado em Python. Sua ideia central: pegue elementos de uma sequência um por um, executando o mesmo bloco de código cada vez.

Sintaxe básica:

PYTHON
for variável in sequência:
    código a repetir

A variável recebe cada elemento da sequência, e o bloco indentado é executado para cada um.

Exemplo: Iterando sobre Listas e Strings (⭐)

PYTHON
# Iterar sobre uma lista
fruits = ["maçã", "banana", "laranja", "uva"]
for fruit in fruits:
    print(f"Eu gosto de {fruit}")

print("---")

# Iterar sobre uma string — caracteres um por um
for char in "Python":
    print(char)
▶ Experimente

Saída:

TEXT
Eu gosto de maçã
Eu gosto de banana
Eu gosto de laranja
Eu gosto de uva
---
P
y
t
h
o
n
💡 Dica de nomenclatura: Nomeie a variável do laço no singular. Se a lista é frutas, use fruta; se alunos, use aluno. O código lê como linguagem natural.


A Função range() — Gerar Sequências Numéricas

Quando você precisa repetir um número fixo de vezes, range() é seu melhor amigo.

range() tem três formas:

Sintaxe Significado Exemplo Resultado
range(stop) 0 → stop-1 range(5) 0,1,2,3,4
range(start, stop) start → stop-1 range(2, 6) 2,3,4,5
range(start, stop, step) Com passo range(1, 10, 2) 1,3,5,7,9

Nota: range() não inclui o valor final — como no fatiamento, é "até mas não incluindo."

Exemplo: Controlando Contagem do Laço com range (⭐)

PYTHON
# Imprime 1 a 5
for i in range(1, 6):
    print(f"Laço {i}")

print("---")

# Passo de 2: imprime números pares de 0 a 10
for i in range(0, 11, 2):
    print(i, end=" ")  # end=" " previne novas linhas
# Saída: 0 2 4 6 8 10
▶ Experimente

Exemplo: Iterando com Índice (⭐⭐)

PYTHON
students = ["Alice", "Bob", "Charlie", "Diana"]

# Obtém índice e elemento
for i in range(len(students)):
    print(f"Aluno {i + 1}: {students[i]}")
▶ Experimente

Saída:

TEXT
Aluno 1: Alice
Aluno 2: Bob
Aluno 3: Charlie
Aluno 4: Diana
💡 Forma mais elegante: Em Python, se você precisa tanto do índice quanto do elemento, use enumerate(). Abordaremos em uma lição posterior.


Laço while

A diferença entre while e for: for sabe quantas vezes repetir; while só sabe quando parar.

Sintaxe básica:

PYTHON
while condição:
    código a repetir

Antes de cada iteração, a condição é verificada. Se for True, o bloco de código executa, então a condição é verificada novamente... até se tornar False.

Exemplo: Contagem Regressiva (⭐)

PYTHON
count = 5
while count > 0:
    print(f"Contagem regressiva: {count}")
    count -= 1  # Decrementa em 1 cada vez — muito importante!

print("Lançar!")
▶ Experimente

Saída:

TEXT
Contagem regressiva: 5
Contagem regressiva: 4
Contagem regressiva: 3
Contagem regressiva: 2
Contagem regressiva: 1
Lançar!
⚠️ Aviso de laço infinito: Se você esquecer count -= 1, a condição count > 0 é sempre True, e o programa executa para sempre até você forçá-lo a parar. Ao escrever laços while, sempre garanta que a condição pode se tornar False em algum momento.

Exemplo: Uso Típico de while — Até um Valor Específico (⭐⭐)

PYTHON
# Continue dividindo pela metade até menos de 1
num = 100
while num >= 1:
    print(num, end=" → ")
    num /= 2
# Saída: 100 → 50.0 → 25.0 → 12.5 → 6.25 → 3.125 → 1.5625 → 0.78125
▶ Experimente

Isso mostra a força do while: não sabemos antecipadamente quantas iterações são necessárias — só sabemos quando parar.


break e continue — Frear e Pular

break — Sair do Laço Imediatamente

Quando uma condição é atendida, break salta para fora de todo o laço, ignorando quaisquer iterações restantes.

continue — Pular a Iteração Atual

Quando uma condição é atendida, continue pula o resto da iteração atual e vai para a próxima.

Exemplo: break vs continue (⭐)

PYTHON
print("=== Exemplo de break ===")
for i in range(1, 10):
    if i == 5:
        break  # Termina o laço ao chegar em 5
    print(i, end=" ")
# Saída: 1 2 3 4

print("\n=== Exemplo de continue ===")
for i in range(1, 10):
    if i == 5:
        continue  # Pula 5, continua com o resto
    print(i, end=" ")
# Saída: 1 2 3 4 6 7 8 9
▶ Experimente

Exemplo: break na Prática — Buscar e Parar (⭐⭐)

PYTHON
# Busca o primeiro número par em uma lista
numbers = [3, 7, 9, 2, 5, 8, 1]

for num in numbers:
    if num % 2 == 0:
        print(f"Primeiro número par encontrado: {num}")
        break  # Para de procurar uma vez encontrado
else:
    print("Nenhum número par na lista")  # Este else pertence ao for
▶ Experimente

Exemplo: continue na Prática — Processar Apenas Dados Válidos (⭐⭐)

PYTHON
# Processa apenas números positivos, pula negativos e zero
data = [3, -5, 0, 8, -2, 7, 0, 4]
positive_sum = 0

for num in data:
    if num <= 0:
        continue  # Pula dados inválidos
    positive_sum += num

print(f"Soma dos números positivos: {positive_sum}")  # Saída: 22 (3+8+7+4)
▶ Experimente

for-else e while-else — "Bônus de Conclusão Normal"

Este é um recurso de sintaxe único do Python, não encontrado em muitas outras linguagens.

O bloco else executa quando o laço completa normalmente (sem ser interrompido por break). Pense assim: "se o laço não foi interrompido, execute este código bônus."

Exemplo: Verificação de Número Primo (⭐⭐)

PYTHON
num = 17

for i in range(2, num):
    if num % i == 0:
        print(f"{num} não é primo, divisível por {i}")
        break
else:
    print(f"{num} é primo!")  # Executa apenas se não houve break
▶ Experimente

Neste exemplo:

💡 Muitos iniciantes acham for-else contra-intuitivo. Lembre-se como: else significa "se não houve break, então...".


Laços Aninhados

Um laço dentro de outro laço é um laço aninhado. Para cada iteração do laço externo, o laço interno executa uma rodada completa.

Exemplo: Tabuada de Multiplicação (⭐⭐)

PYTHON
for i in range(1, 10):         # Laço externo: linhas
    for j in range(1, i + 1):  # Laço interno: colunas
        print(f"{j}×{i}={i*j}", end="\t")
    print()  # Nova linha após cada linha
▶ Experimente

Saída:

TEXT
1×1=1
1×2=2    2×2=4
1×3=3    2×3=6    3×3=9
1×4=4    2×4=8    3×4=12   4×4=16
1×5=5    2×5=10   3×5=15   4×5=20   5×5=25
1×6=6    2×6=12   3×6=18   4×6=24   5×6=30   6×6=36
1×7=7    2×7=14   3×7=21   4×7=28   5×7=35   6×7=42   7×7=49
1×8=8    2×8=16   3×8=24   4×8=32   5×8=40   6×8=48   7×8=56   8×8=64
1×9=9    2×9=18   3×9=27   4×9=36   5×9=45   6×9=54   7×9=63   8×9=72   9×9=81
⚠️ Dica de desempenho: Total de execuções = contagem externa × contagem interna. Aninhamento de N níveis significa crescimento exponencial. Cuidado com 3+ níveis de aninhamento ao lidar com grandes conjuntos de dados.

Exemplo: break Afeta Apenas o Nível Atual (⭐⭐)

PYTHON
for i in range(1, 4):
    for j in range(1, 10):
        if j > i:
            break  # Apenas interrompe o laço interno
        print(f"({i},{j})", end=" ")
    print()
▶ Experimente

Saída:

TEXT
(1,1)
(2,1) (2,2)
(3,1) (3,2) (3,3)

Exemplos Abrangentes

Exemplo 1: Jogo de Adivinhação de Números (⭐⭐)

O sistema gera um número aleatório entre 1 e 100. O jogador tenta adivinhar, e o sistema dá dicas ("muito alto" ou "muito baixo") até o jogador acertar.

PYTHON
import random

# Gera um alvo aleatório
target = random.randint(1, 100)
attempts = 0

print("🎯 Adivinhe o Número! Estou pensando em um número entre 1 e 100.")

while True:  # Laço infinito, saída via break
    try:
        guess = int(input("Digite seu palpite: "))
    except ValueError:
        print("Por favor, digite um número válido!")
        continue

    attempts += 1

    if guess < target:
        print("Muito baixo, tente mais alto!")
    elif guess > target:
        print("Muito alto, tente mais baixo!")
    else:
        print(f"🎉 Parabéns! É {target}!")
        print(f"Você acertou em {attempts} tentativas.")
        break  # Sai do laço ao acertar
▶ Experimente

Pontos-chave:

Exemplo 2: Verificador de Força de Senha (⭐⭐⭐)

Verifica a senha do usuário e pontua sua força.

PYTHON
password = input("Digite sua senha: ")
score = 0
feedback = []

# 1. Verifica comprimento
if len(password) >= 8:
    score += 1
else:
    feedback.append("❌ Senha tem menos de 8 caracteres")

# 2. Verifica tipos de caracteres
has_upper = False
has_lower = False
has_digit = False
has_special = False
special_chars = "!@#$%^&*"

for char in password:
    if char.isupper():
        has_upper = True
    elif char.islower():
        has_lower = True
    elif char.isdigit():
        has_digit = True
    elif char in special_chars:
        has_special = True

# Pontuação baseada nas verificações
checks = [has_upper, has_lower, has_digit, has_special]
score += sum(checks)

if not has_upper:
    feedback.append("❌ Falta letra maiúscula")
if not has_lower:
    feedback.append("❌ Falta letra minúscula")
if not has_digit:
    feedback.append("❌ Falta dígito")
if not has_special:
    feedback.append("❌ Falta caractere especial")

# 3. Exibe resultados
print(f"\nForça da senha: {score}/5")
if feedback:
    print("Sugestões:")
    for item in feedback:
        print(f"  {item}")
else:
    print("🎉 Senha forte!")
▶ Experimente

Execução de exemplo:

TEXT
Digite sua senha: Hello123
Força da senha: 3/5
Sugestões:
  ❌ Falta caractere especial
TEXT
Digite sua senha: P@ssw0rd!
Força da senha: 5/5
🎉 Senha forte!

Casos de Uso Comuns

Cenário Laço Recomendado Observações
Iterar sobre lista/tupla/conjunto for Processar elementos um por um
Iterar sobre pares chave-valor de dicionário for Use .items()
Repetir N vezes for + range() Número fixo de iterações
Até que uma condição seja atendida while Número desconhecido de iterações
Ler arquivo até EOF for / while Objetos de arquivo são iteráveis
Validação de entrada do usuário while + break Laço até entrada válida
Laço infinito (servidor, jogo) while True Saída via break

❓ Perguntas Frequentes

P: Quando devo usar for vs while? R: Use for quando você sabe o número de iterações (iterar sobre listas/ranges/strings). Use while quando você sabe a condição de parada (aguardando entrada, aproximando-se de um valor). Eles são frequentemente intercambiáveis, mas escolher o certo torna o código mais claro. ⚠️ P: for i in range(len(lista)) é pytônico? R: Na verdade não. Python prefere iteração direta: for item in lista. Só use range(len(...)) quando você precisar especificamente de índices — e mesmo assim, enumerate() é mais elegante. P: E se eu tiver muitos laços aninhados? R: Aninhamento além de 3 níveis prejudica a legibilidade. Soluções: extraia laços internos para funções, use itertools para combinações, ou repense o algoritmo.


📖 Resumo


📝 Atividades

⭐ Exercício 1: Soma dos Números Pares

Use um laço for e range() para calcular a soma de todos os números pares entre 1 e 100.

Dica: range(2, 101, 2) resolve em um passo.

⭐⭐ Exercício 2: Sequência de Fibonacci

Definição: os dois primeiros números são 1, e cada número subsequente é a soma dos dois anteriores. Sequência: 1, 1, 2, 3, 5, 8, 13, 21, ...

Use um laço while para exibir todos os números de Fibonacci que não excedam 1000.

Dica: use três variáveis a, b para os dois números atuais, compute a + b para o próximo, depois desloque.

⭐⭐⭐ Exercício 3: Calculadora Simples

Escreva um programa que repetidamente pede dois números e um operador (+, -, *, /), exibe o resultado. Digite q para sair.

Requisitos:

Execução de exemplo:

TEXT
Digite o primeiro número: 10
Digite o operador (+ - * /): /
Digite o segundo número: 3
= 3.333...

Digite o primeiro número: 8
Digite o operador (+ - * /): %
Operador inválido, use + - * /

Digite o primeiro número: 8
Digite o operador (+ - * /): /
Digite o segundo número: 0
Erro: não é possível dividir por zero

Digite o primeiro número: q
Até logo!
100%