Módulo 7 - Condições com if, elif e else

Indentação sem erro: a regra dos 4 espaços

9 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Aplicar a regra dos 4 espaços em todo bloco.
  • Reconhecer e corrigir os três IndentationError mais comuns.
  • Resolver a questão do Tab contra espaços com o editor.
  • Escrever um if dentro de outro sem se perder no recuo.

No Python, o recuo é gramática

Outras linguagens marcam blocos com chaves e tratam o recuo como decoração. O Python tomou uma decisão diferente e famosa: o recuo é a própria marcação. As linhas deslocadas 4 espaços após um if formam o bloco dele; a primeira linha que volta à margem esquerda está fora. Não há chave para abrir nem fechar. A consequência prática é dupla: todo código Python do mundo tem o mesmo visual arrumado, e um recuo errado deixa de ser deselegância para virar erro de sintaxe.

A regra é uma e curta: 4 espaços por nível de bloco. Esse número vem da PEP 8, o guia oficial de estilo do Python, e é o padrão que todo editor moderno aplica sozinho. Dois espaços funcionam tecnicamente, oito também, desde que consistentes dentro do bloco, mas nadar contra o padrão só compra atrito. Neste curso, 4 espaços, sempre. Seus dedos aprendem em uma semana e o VS Code faz a maior parte do trabalho.

Três IndentationError reais, com correção

A melhor vacina contra o IndentationError é ver os três formatos dele antes de encontrá-los sozinho. Cada exemplo abaixo quebra de um jeito, e o comentário aponta o motivo. Digite-os no laboratório, leia cada mensagem de erro e depois conserte: esse ciclo de dez minutos economiza horas no resto do curso.

idade = 20

if idade >= 18:
print("Maior de idade")  # IndentationError: expected an indented block

# Erro 1: o if promete um bloco e a linha de baixo
# está na margem. Correção: recuar o print 4 espaços.

Erro 1: faltou indentar. O if terminou em dois pontos, então o Python exige pelo menos uma linha recuada.

print("Bem-vindo!")
    print("ao curso de Python")  # IndentationError: unexpected indent

# Erro 2: recuo do nada. Não há if, while ou def antes,
# então esse deslocamento não pertence a bloco nenhum.
# Correção: alinhar o segundo print na margem esquerda.

Erro 2: sobrou indentação. Recuo só existe a serviço de um bloco; sem bloco aberto, ele é erro.

idade = 20

if idade >= 18:
    print("Maior de idade")
      print("Pode votar")  # IndentationError: unexpected indent

# Erro 3: mistura de niveis no MESMO bloco (4 espaços
# numa linha, 6 na outra). Correção: as duas linhas
# do bloco com exatamente 4 espaços.

Erro 3: recuo inconsistente. Linhas do mesmo bloco precisam do mesmo recuo, espaço por espaço.

Repare que as três mensagens dizem coisas diferentes: expected an indented block quando falta recuo, unexpected indent quando sobra ou desalinha. Ler a mensagem antes de sair mexendo no código já revela qual dos três casos você tem em mãos. E todas apontam a linha exata, então a busca nunca é longa.

Tab contra espaços e blocos aninhados

A dúvida clássica: posso apertar Tab em vez de contar espaços? Pode, porque o editor resolve por você. O VS Code, o editor do curso, vem configurado para inserir 4 espaços quando você aperta Tab num arquivo Python, e o Playground faz o mesmo. O perigo real é misturar: um arquivo com Tabs de verdade em umas linhas e espaços em outras gera TabError, primo do IndentationError. Isso acontece quase sempre ao colar código de fontes diferentes. Se aparecer, selecione o bloco no editor e re-indente, ou apague o recuo das linhas e refaça com Tab.

Falta o caso que assusta à primeira vista: um bloco dentro do outro. Um if dentro de um if é perfeitamente legal, e a regra continua a mesma, aplicada em camadas: cada nível soma 4 espaços. O bloco externo fica com 4, o interno com 8. Leia o exemplo da portaria com duas verificações, acompanhando o recuo de cada linha.

idade = 20
tem_ingresso = True

if idade >= 18:
    if tem_ingresso:
        print("Entrada liberada. Bom show!")
    else:
        print("Compre o ingresso na bilheteria.")
else:
    print("Evento para maiores de 18 anos.")

Blocos aninhados: o if interno vive com 4 espaços, o conteúdo dele com 8. Cada else se alinha com o if do próprio nível.

A dica de leitura: cada else pertence ao if que está na mesma coluna que ele. O else de 4 espaços responde ao if tem_ingresso; o else da margem responde ao if idade >= 18. Quando o aninhamento passar de dois níveis, considere reescrever com and (if idade >= 18 and tem_ingresso:) ou com elif, que a aula 4 mostrou. Recuo fundo demais é o código pedindo simplificação.

Teste rápido

Um if termina em dois pontos e a linha seguinte está colada na margem esquerda. O que o Python faz?

Perguntas frequentes

Por que o Python escolheu indentação em vez de chaves?
Por legibilidade. Programadores já indentavam código com chaves para conseguir ler; o Python tornou obrigatório o que era boa prática e eliminou as chaves como redundância. O resultado é que todo código Python do mundo tem estrutura visual parecida, o que facilita ler código dos outros.
Tem que ser 4 espaços ou pode ser 2?
O Python aceita qualquer quantidade consistente dentro do mesmo bloco, mas a PEP 8, o guia oficial de estilo, define 4 espaços como padrão, e o ecossistema inteiro segue. Usar 2 funciona tecnicamente e atrapalha na prática, porque o seu código destoa de todo exemplo, tutorial e colega. Fique nos 4.
Apertar Tab é errado então?
Não. Nos editores configurados para Python, incluindo o VS Code e o Playground do curso, a tecla Tab insere 4 espaços, então apertar Tab é o jeito confortável de seguir a regra. O problema é o caractere de tabulação cru misturado com espaços no mesmo arquivo, situação que gera TabError e nasce quase sempre de colar código de fora.
Como sei onde um bloco termina se não tem chave de fechamento?
Pelo recuo: o bloco termina na primeira linha que volta a um nível de indentação menor. Se o bloco do if está com 4 espaços, a primeira linha com 0 espaços já está fora dele. Com o tempo, a leitura vira automática, ajudada pelas linhas-guia verticais que o VS Code desenha.
Linha em branco no meio do bloco quebra a indentação?
Não. O Python ignora linhas em branco ao delimitar blocos, então você pode usá-las para respirar o código. O que importa é o recuo das linhas com conteúdo: essas precisam manter o nível do bloco a que pertencem.
Existe limite de níveis de aninhamento?
Na prática do dia a dia, não há limite que você vá encontrar. O limite real é o da legibilidade: código com quatro ou mais níveis de recuo fica difícil de acompanhar, e quase sempre um and, um elif ou uma função (módulo 13) achata a estrutura. Recuo profundo é cheiro de código pedindo reforma.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.