Loops Dentro
de Loops
Quando uma repetição não basta — o conceito de aninhar laços e o controle independente das variáveis de cada nível.
Quando uma repetição não basta — o conceito de aninhar laços e o controle independente das variáveis de cada nível.
Identificar situações que exigem repetição dupla e entender o conceito de loop dentro de loop
Reconhecer o papel do loop externo e do loop interno em estruturas bidimensionais
Gerir variáveis de cada nível sem conflito de escopo — usar i, j, k
Aplicar acumuladores e implementar padrões clássicos como calendário e pirâmide
Imagine que você trabalha numa grande loja de departamentos e precisa criar etiquetas de preço para cada produto:
Seria eficiente escrever 50 comandos individuais? E se a loja crescer para 20 prateleiras × 30 produtos?
Um loop aninhado é, basicamente, um laço dentro de outro. É uma estrutura poderosa que permite trabalhar com dados bidimensionais (linhas e colunas) ou executar uma ação repetitiva várias vezes — em camadas.
for prateleira in range(1, 6):
for produto in range(1, 11):
print(f"Etiqueta {prateleira}-{produto}")
Etiqueta 1-1 Etiqueta 1-2 Etiqueta 1-3 ⋮ Etiqueta 1-10 Etiqueta 2-1 Etiqueta 2-2 ⋮ Etiqueta 5-10
O loop externo controla a linha (a prateleira), enquanto o loop interno controla a coluna (o produto). A cada volta do externo, o interno percorre tudo de novo.
# 5 prateleiras × 10 produtos
for i in range(1, 6): # linha
for j in range(1, 11): # coluna
print(f"Etiqueta {i}-{j}")
Etiqueta 1-1 Etiqueta 1-2 ⋮ Etiqueta 1-10 Etiqueta 2-1 ⋮ Etiqueta 4-10 Etiqueta 5-1 ⋮ Etiqueta 5-10 # 5 × 10 = 50 prints
Percorrer cada pixel de uma imagem, linha por linha e coluna por coluna.
Acessar cada célula de uma planilha do Excel, mês a mês, produto a produto.
Desenhar o mapa de um jogo estruturado em uma grade de elementos.
Processar matrizes e outras estruturas bidimensionais em análises.
Em comum: dois eixos a percorrer — algo se repete dentro de algo que também se repete.
Objetivo: imprimir um calendário de 4 semanas × 7 dias, mostrando os dias numerados de 1 a 28 — uma linha por semana.
Abra o Python (VS Code, Replit ou IDLE) e crie um arquivo calendario.py
Antes dos loops, crie um contador: dia = 1 — ele vai crescer a cada dia impresso
Loop externo: for semana in range(1, 5) — controla as 4 semanas (linhas)
Loop interno: for d in range(1, 8) — imprima dia, some +1, e print() vazio quebra a linha ao fim do interno
dia = 1
for semana in range(1, 5): # 4 semanas
for d in range(1, 8): # 7 dias por semana
print(f"{dia:2}", end=" ")
dia = dia + 1
print() # quebra de linha ao fim da semana
# Saída:
# 1 2 3 4 5 6 7
# 8 9 10 11 12 13 14
# 15 16 17 18 19 20 21
# 22 23 24 25 26 27 28
dia é declarada fora dos dois loops (se ficasse dentro, zerava a cada volta); o end=" " mantém os números na mesma linha; e o print() vazio — fora do interno, dentro do externo — quebra a linha entre as semanas. Esse padrão de dia que cresce a cada iteração tem nome: acumulador — formalizamos daqui a pouco.
Em loops aninhados, cada nível usa sua própria variável de controle. O avanço de uma não altera o valor da outra — elas são independentes.
Controla a linha (a "prateleira")
Controla a coluna (o "produto")
Para um terceiro aninhamento, se necessário
i, j, k nessa ordem para os três primeiros níveis. É um padrão lido por qualquer programador no mundo.
A variável do loop externo é visível dentro do interno — pode ser usada em condições e cálculos. Esse é o "superpoder" dos loops aninhados.
Em Python, i e j continuam existindo mesmo depois do loop terminar (ficam com o último valor que tiveram). Mas não use a variável do interno fora dele — vira fonte de bug.
for i in range(1, 4):
for j in range(1, 6):
print(f"{i}-{j}") # ✅ usa i e j juntos
# j ainda existe, mas o "sentido"
# de iteração já acabou
print(f"linha {i} ok") # ✅ usa i
# i e j ficam com o ÚLTIMO valor
# evite usá-los aqui — confunde quem lê
O erro mais comum em loops aninhados é reutilizar a mesma variável nos dois níveis. Isso causa comportamento inesperado, loops infinitos ou erros de sintaxe.
# Usando 'i' nos dois loops
for i in range(1, 6):
for i in range(1, 6): # 💥 sobrescreve o externo!
print("*", end="")
# Cada loop com sua variável
for i in range(1, 6):
for j in range(1, 6):
print("*", end="")
Um acumulador é uma variável que "coleciona" ou "soma" valores a cada iteração. Em loops aninhados, ele permite somar todos os elementos de uma matriz ou contar itens que atendem a uma condição.
total = 0
for i in range(1, 6):
for j in range(1, 6):
total = total + (i * j)
print("Total:", total)
total) é declarado antes do loop externo e atualizado dentro do interno. Se inicializasse dentro, ele zeraria a cada volta!
Objetivo: desenhar uma pirâmide centralizada. Cada linha precisa de duas coisas: os espaços à esquerda (que recuam) e os asteriscos (que crescem em números ímpares: 1, 3, 5, 7, 9).
Loop externo: linha de 1 a 5
1º loop interno: imprime (5 − linha) espaços
2º loop interno: imprime (2 × linha − 1) asteriscos
Ao fim, print() vazio para quebrar a linha
Dois loops internos dentro do mesmo externo: um cuida do recuo, o outro do desenho.
for linha in range(1, 6):
for c in range(5 - linha): # espaços à esquerda
print(" ", end="")
for c in range(2 * linha - 1): # asteriscos da linha
print("*", end="")
print() # quebra de linha
linha do externo — prova de que o externo é visível dentro do interno.
# Esperávamos um triângulo crescente…
for linha in range(1, 6):
for coluna in range(1, linha + 1):
print("*")
end="") ✅print por padrão pula linha. Para imprimir na mesma linha, use print("*", end=""). Esse é um dos bugs mais comuns de quem está começando.
i, j, k) → cada loop com sua própria variável de controleComplexidade e otimização — você vai descobrir por que O(n²) assusta os programadores, aprender a medir o custo do código e fechar a semana com um laboratório prático de padrões geométricos.