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:
for— para "iterar" sobre uma sequência (lista, string, range, etc.)while— para "executar enquanto a condição for verdadeira"
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:
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 (⭐)
# 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)
Saída:
Eu gosto de maçã
Eu gosto de banana
Eu gosto de laranja
Eu gosto de uva
---
P
y
t
h
o
n
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 (⭐)
# 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
Exemplo: Iterando com Índice (⭐⭐)
students = ["Alice", "Bob", "Charlie", "Diana"]
# Obtém índice e elemento
for i in range(len(students)):
print(f"Aluno {i + 1}: {students[i]}")
Saída:
Aluno 1: Alice
Aluno 2: Bob
Aluno 3: Charlie
Aluno 4: Diana
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:
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 (⭐)
count = 5
while count > 0:
print(f"Contagem regressiva: {count}")
count -= 1 # Decrementa em 1 cada vez — muito importante!
print("Lançar!")
Saída:
Contagem regressiva: 5
Contagem regressiva: 4
Contagem regressiva: 3
Contagem regressiva: 2
Contagem regressiva: 1
Lançar!
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 (⭐⭐)
# 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
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 (⭐)
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
Exemplo: break na Prática — Buscar e Parar (⭐⭐)
# 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
Exemplo: continue na Prática — Processar Apenas Dados Válidos (⭐⭐)
# 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)
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 (⭐⭐)
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
Neste exemplo:
- Se um divisor for encontrado,
breaké acionado,elsenão executa - Se nenhum divisor for encontrado após verificar todas as possibilidades, o laço termina normalmente, e
elseexecuta
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 (⭐⭐)
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
Saída:
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
Exemplo: break Afeta Apenas o Nível Atual (⭐⭐)
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()
Saída:
(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.
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
Pontos-chave:
while Truecombreaké um padrão muito comum em Pythontry-exceptcaptura entrada não numérica,continuesolicita ao usuário novamentebreaksai do laço quando acerta
Exemplo 2: Verificador de Força de Senha (⭐⭐⭐)
Verifica a senha do usuário e pontua sua força.
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!")
Execução de exemplo:
Digite sua senha: Hello123
Força da senha: 3/5
Sugestões:
❌ Falta caractere especial
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
forvswhile? R: Useforquando você sabe o número de iterações (iterar sobre listas/ranges/strings). Usewhilequando 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ó userange(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, useitertoolspara combinações, ou repense o algoritmo.
📖 Resumo
foritera sobre sequências (listas, strings, range, etc.)range(start, stop, step)gera sequências numéricas; stop é exclusivo; step pode ser negativowhileé orientado por condição; evite laços infinitosbreaksai de todo o laço;continuepula a iteração atualfor-else/while-else— específico do Python;elseexecuta quando o laço não foi encerrado viabreak- Laços aninhados: cada iteração externa dispara um laço interno completo; total = produto das contagens
📝 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:
- Use
while Trueebreak - Trate divisão por zero
- Trate operadores inválidos (mostre uma dica, não saia)
- Use
continuepara re-prompt em entrada inválida
Execução de exemplo:
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!



