Python Sintaxe e Indentação

Toda língua tem gramática: em português, a frase "bolo a fez Ana o" tem as palavras certas na ordem errada, e ninguém entende. Nas linguagens de programação, a gramática se chama sintaxe, e o computador é muito mais exigente que uma pessoa: um sinal fora do lugar e ele para. A boa notícia é que a sintaxe do Python é pequena. Nesta aula você vai conhecer as regras que valem para todo programa: uma instrução por linha, maiúsculas que importam, os dois-pontos e, a mais famosa de todas, a indentação (o recuo no começo da linha), que no Python não é enfeite: ela faz parte do programa.

Você vai aprender
  • O que é sintaxe, e que o Python lê o arquivo uma linha (uma instrução) de cada vez.
  • Que maiúsculas e minúsculas são diferentes: nome, Nome e NOME são três coisas.
  • O que é um bloco: os dois-pontos (:) que o abrem e a indentação que diz o que está dentro dele.
  • Por que usar 4 espaços, e nunca misturar com Tab.
  • Onde os espaços não importam, como quebrar uma linha longa e quais são as palavras reservadas.
  • Os erros reais: IndentationError, TabError, SyntaxError: expected ':' e as dicas novas do Python 3.14.

A ideia: a lista de tarefas com sub-itens

A Ana anota as tarefas do sábado num caderno. Algumas tarefas têm sub-tarefas, e ela escreve essas um pouco mais para a direita, para mostrar que pertencem à tarefa de cima:

Ir à feira:
    comprar tomate
    comprar banana
Passar na padaria:
    pegar o pão
Arrumar a casa

Ninguém precisou explicar: "comprar tomate" e "comprar banana" fazem parte de "Ir à feira", porque estão recuadas embaixo dela. "Arrumar a casa", de volta à margem, já é outra tarefa. Os dois-pontos no fim de "Ir à feira:" avisam: "vem uma lista aí embaixo".

O Python usa exatamente essa ideia. Os dois-pontos abrem um bloco, e as linhas recuadas embaixo deles formam o bloco. Muitas outras linguagens usam chaves { } para isso e deixam o recuo como enfeite. O Python não tem chaves: o recuo é a regra.


1. Uma instrução por linha

Num programa Python, cada linha é, normalmente, uma instrução: uma ordem completa, como "mostre isto" ou "guarde aquilo". O fim da linha é o fim da instrução, sem ponto e vírgula. O Python lê as linhas de cima para baixo, uma de cada vez, como você viu em Rodando um Programa.

Linhas em branco não contam: o Python pula. Use-as para separar partes do programa, como parágrafos num texto.

Dá para pôr duas instruções numa linha, mas não faça

O ponto e vírgula separa instruções na mesma linha: print("um"); print("dois") funciona (você vai ver na seção 6). Mas o costume em Python é uma instrução por linha, que é mais fácil de ler. O Zen do Python diz: "a legibilidade conta".


2. Maiúsculas e minúsculas são diferentes

Para o Python, a e A são letras diferentes, como a e b. Isso vale para tudo: nomes de variáveis, de funções, palavras da linguagem. A Ana guardou o nome numa variável e, na hora de mostrar, escreveu com maiúscula:

nome = "Ana"
print(Nome)
$ python3 s1.py
Traceback (most recent call last):
  File "/home/ana/python/s1.py", line 2, in <module>
    print(Nome)
          ^^^^
NameError: name 'Nome' is not defined. Did you mean: 'nome'?

nome existe; Nome, não. O Python percebeu a semelhança e sugeriu: "você quis dizer nome?". O mesmo acontece com as palavras que já vêm na linguagem. "Verdadeiro" em Python é True, com T maiúsculo:

aberto = true
print(aberto)
$ python3 s2.py
Traceback (most recent call last):
  File "/home/ana/python/s2.py", line 1, in <module>
    aberto = true
             ^^^^
NameError: name 'true' is not defined. Did you mean: 'True'?
CertoErradoPor quê
printPrint, PRINTAs funções do Python são em minúsculas
if, for, whileIf, For, WhileAs palavras da linguagem também
True, False, Nonetrue, false, noneEssas três são as exceções: começam com maiúscula
nome sempre igualnome num lugar, Nome em outroUma variável tem um nome só, letra por letra

O costume em Python é escrever os nomes das suas variáveis em minúsculas, com sublinhado entre as palavras: preco_do_pao, nome_do_cliente. Assim você nunca precisa lembrar onde havia maiúscula. A aula Nomes de Variáveis traz todas as regras.


3. Os dois-pontos e o bloco

Agora o assunto principal. Para ver um bloco funcionando, você precisa de uma instrução que tenha um. A mais simples é o if ("se"), que executa um bloco só se uma condição for verdadeira. Ele tem aula própria (if); aqui ele só serve de exemplo. Este programa confere se a pessoa já pode votar:

idade = 20
if idade >= 18:
    print("Pode votar.")
    print("Não esqueça o título de eleitor.")
print("Fim da consulta.")
idade = 20
Guarda o número 20 na variável idade.
if idade >= 18
"Se a idade for maior ou igual a 18". O >= é o "maior ou igual" (aula Comparações).
:
Os dois-pontos: "aí vem o bloco". Toda linha que abre um bloco termina com eles (if, else, for, while, def…).
print("Pode votar.")
Recuada 4 espaços: está dentro do bloco do if. Só roda se a condição for verdadeira.
print("Não esqueça…")
Com o mesmo recuo: também dentro do bloco.
print("Fim da consulta.")
De volta à margem: o bloco acabou. Esta linha está fora do if, e roda sempre.
$ python3 voto.py
Pode votar.
Não esqueça o título de eleitor.
Fim da consulta.

Com 20 anos, a condição é verdadeira, e as três linhas aparecem. Agora a Ana trocou a primeira linha para idade = 15:

$ python3 voto15.py
Fim da consulta.                                   « o bloco inteiro foi pulado

Com 15, a condição é falsa: o Python pulou o bloco inteiro (as duas linhas recuadas) e continuou na primeira linha de volta à margem. É assim que ele sabe onde o bloco acaba: quando o recuo volta.

Missão: a Ana esqueceu o recuo, e o programa dá erro. Rode para ver a mensagem. Depois, coloque 4 espaços no começo da linha do print, para ela entrar no bloco do if, e rode de novo.

idade = 20
if idade >= 18:
print("Pode votar.")
idade = 20
if idade >= 18:
    print("Pode votar.")

4. A indentação muda o que o programa faz

Como o recuo é a regra, mover uma linha para a direita ou para a esquerda muda o significado do programa, sem dar erro nenhum. Compare com o voto.py: aqui, o "Fim da consulta." também foi recuado, e a idade é 15:

idade = 15
if idade >= 18:
    print("Pode votar.")
    print("Não esqueça o título de eleitor.")
    print("Fim da consulta.")
$ python3 s9.py
$                                                  « nada: até o "Fim" ficou dentro do if

O programa não mostrou nada. Para o Python, as três linhas fazem parte do bloco do if, e o bloco inteiro foi pulado. Não houve erro, porque o programa está "gramaticalmente" certo; só não faz o que a Ana queria. Por isso, olhe sempre o recuo com atenção: ele diz a qual bloco cada linha pertence.

Missão: com 15 anos, o programa não mostra nada. Faça o Fim da consulta. aparecer sempre, seja qual for a idade: tire o recuo só da última linha, para ela sair do bloco do if.

idade = 15
if idade >= 18:
    print("Pode votar.")
    print("Não esqueça o título de eleitor.")
    print("Fim da consulta.")
idade = 15
if idade >= 18:
    print("Pode votar.")
    print("Não esqueça o título de eleitor.")
print("Fim da consulta.")

5. Quatro espaços, e nada de misturar com Tab

O Python aceita qualquer quantidade de espaços como recuo, desde que todas as linhas do mesmo bloco tenham a mesma. Mas o costume, seguido por praticamente todo programa Python do mundo, é 4 espaços por nível. Ele está escrito no guia de estilo oficial da linguagem, a PEP 8. Siga o costume: o seu código fica igual ao de todo mundo, e você evita os erros da próxima seção.

A tecla Tab é outra história. Ela insere um caractere especial, a tabulação, que aparece na tela como um "pulo" para a direita, mas não é a mesma coisa que espaços. Se uma linha do bloco usar espaços e outra usar Tab, as duas podem parecer iguais na tela e ainda assim ser diferentes para o Python. Por isso:

  • Configure o seu editor para que a tecla Tab insira 4 espaços. Os editores feitos para programar (Thonny, VS Code, IDLE) já fazem isso nos arquivos .py.
  • No modo interativo do Python 3.14, o recuo vem sozinho depois dos dois-pontos, já com 4 espaços (aula O Modo Interativo).
  • Cuidado ao copiar código de sites e documentos: ele pode vir com tabulações.
NívelRecuoExemplo
Fora de qualquer bloco0 espaçosif idade >= 18:
Dentro de um bloco4 espaços print("Pode votar.")
Um bloco dentro de outro8 espaçosVocê vai ver na aula Condições Aninhadas

6. Onde os espaços não importam

O recuo no começo da linha é sagrado. Já os espaços no meio da linha, entre os nomes e os sinais, o Python ignora:

print(2 + 3)
print(2+3)
print( 2   +   3 )
print("um"); print("dois")
$ python3 espacos.py
5
5
5
um
dois

As três primeiras linhas dão o mesmo resultado. Mas a primeira é a que o guia de estilo (a PEP 8) recomenda: um espaço de cada lado do sinal, nenhum espaço logo depois de abrir ou antes de fechar o parêntese. A quarta linha mostra o ponto e vírgula juntando duas instruções; funciona, mas evite. (Dentro das aspas, claro, todo espaço conta: "Ana" e " Ana" são textos diferentes.)

Linhas longas

Quando uma instrução fica comprida demais, você pode quebrá-la em várias linhas enquanto um parêntese estiver aberto. O Python só considera a instrução terminada quando o parêntese fecha, e o recuo das linhas de continuação é livre (o costume é alinhar com o que está em cima):

total = (10 * 0.75
         + 6.50
         + 2 * 3.50)
print("Total:", total)
print("Padaria Pão Quente,",
      "a melhor do bairro!")
$ python3 longa.py
Total: 21.0
Padaria Pão Quente, a melhor do bairro!

O mesmo vale para colchetes [ ] e chaves { }, que você vai conhecer nas listas e nos dicionários. A PEP 8 sugere linhas de no máximo 79 caracteres, mas o importante é que o código caiba na tela sem rolar para o lado.


7. Palavras reservadas

Algumas palavras são da própria linguagem e não podem ser usadas como nomes de variáveis. O Python lista todas elas no módulo keyword:

$ python3 -c 'import keyword; print(keyword.kwlist)'
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
$ python3 -c 'import keyword; print(len(keyword.kwlist))'
35

São 35. Você não precisa decorar: ao longo do guia, cada uma ganha a sua aula. Repare que todas são em minúsculas, menos True, False e None. Se você tentar usar uma delas como nome, o Python reclama. A Ana quis guardar a turma da filha numa variável chamada class ("turma", em inglês):

class = "3º ano"
print(class)
$ python3 s11.py
  File "/home/ana/python/s11.py", line 1
    class = "3º ano"
          ^
SyntaxError: invalid syntax

class é a palavra que cria classes (aula Classes e Objetos), e depois dela o Python esperava o nome de uma classe, não um =. Use um nome em português, que nunca vai bater com uma palavra reservada: turma = "3º ano".

As palavras "quase reservadas"

Existem ainda quatro soft keywords ("palavras reservadas leves"): _, case, match e type. Elas só são especiais em certos lugares (como o match e case) e, fora deles, podem ser nomes. Mesmo assim, evite usá-las como nomes de variáveis.

$ python3 -c 'import keyword; print(keyword.softkwlist)'
['_', 'case', 'match', 'type']

Formas diferentes de escrever o mesmo bloco

O Python aceita outras quantidades de espaço no recuo, e até um bloco de uma linha só, colado nos dois-pontos. Os três programas abaixo fazem a mesma coisa:

if idade >= 18:
    print("Pode votar.")
if idade >= 18:
  print("Pode votar.")
if idade >= 18: print("Pode votar.")
FormaQuando usar
4 espaçosSempre. É a recomendação da PEP 8 e o que todo mundo espera ler
2 espaços (ou outro número)Funciona, se for igual em todo o bloco. Evite: foge do costume, e misturar com código de outras pessoas vira confusão
Na mesma linha dos dois-pontosFunciona para um bloco de uma linha só, mas a PEP 8 desaconselha: fica mais difícil de ler e de acrescentar linhas depois
Tab (a tabulação)Não. Configure o editor para trocar o Tab por 4 espaços

Quando dá errado

Os erros de sintaxe e de indentação têm uma coisa em comum: o Python os descobre antes de rodar o programa, ao ler o arquivo inteiro. Por isso nenhuma linha roda, e a mensagem não começa com Traceback (veja a aula Seu Primeiro Programa).

Esqueceu os dois-pontos
idade = 20
if idade >= 18
    print("Pode votar.")
$ python3 s4.py
  File "/home/ana/python/s4.py", line 2
    if idade >= 18
                  ^
SyntaxError: expected ':'

O que aconteceu: "esperava :". O ^ aponta para o fim da linha 2, exatamente onde os dois-pontos deveriam estar. Como resolver: if idade >= 18:.

Esqueceu o recuo do bloco
idade = 20
if idade >= 18:
print("Pode votar.")
$ python3 s5.py
  File "/home/ana/python/s5.py", line 3
    print("Pode votar.")
    ^^^^^
IndentationError: expected an indented block after 'if' statement on line 2

O que aconteceu: IndentationError é o "erro de indentação". A mensagem diz: "esperava um bloco indentado depois da instrução if da linha 2". Os dois-pontos prometeram um bloco, e a linha seguinte veio sem recuo. Como resolver: 4 espaços antes do print.

Recuo onde não tem bloco
print("Bom dia!")
    print("Tudo bem?")
$ python3 s6.py
  File "/home/ana/python/s6.py", line 2
    print("Tudo bem?")
IndentationError: unexpected indent

O que aconteceu: "indentação inesperada". A segunda linha está recuada, mas nenhuma linha com dois-pontos abriu um bloco antes dela. Acontece muito ao colar código copiado de outro lugar, que vem com espaços na frente. Como resolver: tire o recuo; as duas linhas ficam na margem.

Recuo "torto": nem dentro, nem fora
idade = 20
if idade >= 18:
    print("Pode votar.")
  print("Não esqueça o título de eleitor.")
$ python3 s7.py
  File "/home/ana/python/s7.py", line 4
    print("Não esqueça o título de eleitor.")
                                             ^
IndentationError: unindent does not match any outer indentation level

O que aconteceu: a linha 4 tem 2 espaços: menos que o bloco (4) e mais que a margem (0). Como o recuo diminuiu, o Python entendeu que o bloco acabou e tentou voltar a um nível anterior, mas não existe nenhum nível de 2 espaços. A mensagem diz: "o recuo diminuído não corresponde a nenhum nível de indentação de fora". Como resolver: decida onde a linha deve ficar: com 4 espaços (dentro do bloco) ou com 0 (fora).

Espaços e Tab misturados: TabError

A Ana escreveu a terceira linha com 4 espaços e a quarta com a tecla Tab. No editor dela, as duas pareciam alinhadas:

idade = 20
if idade >= 18:
    print("Pode votar.")
	print("Não esqueça o título de eleitor.")
$ python3 s8.py
  File "/home/ana/python/s8.py", line 4
    	print("Não esqueça o título de eleitor.")
    ^
TabError: inconsistent use of tabs and spaces in indentation

O que aconteceu: "uso inconsistente de tabulações e espaços na indentação". O Python não sabe quantos espaços uma tabulação "vale" (cada editor mostra de um jeito), então se recusa a adivinhar se a linha 4 está no mesmo bloco da linha 3. É o Zen do Python: "diante da ambiguidade, recuse a tentação de adivinhar".

Como resolver: apague o recuo da linha e digite 4 espaços. Para não acontecer de novo, configure o editor para inserir espaços quando você aperta Tab. Muitos editores têm uma opção para mostrar os espaços e as tabulações como pontinhos e setas; ela ajuda a achar o culpado.

If com maiúscula, ou digitado errado 3.14
$ python3 s3.py
  File "/home/ana/python/s3.py", line 2
    If idade >= 18:
    ^^
SyntaxError: invalid syntax. Did you mean 'if'?
$ python3 s10.py
  File "/home/ana/python/s10.py", line 2
    iff idade >= 18:
    ^^^
SyntaxError: invalid syntax. Did you mean 'if'?

O que aconteceu: em s3.py a Ana escreveu If e, em s10.py, iff. Nenhum dos dois é uma palavra do Python, então a linha não faz sentido ("sintaxe inválida"). A dica "você quis dizer if?" é uma novidade do Python 3.14: ele agora reconhece palavras reservadas digitadas errado. Num Python mais antigo, a mensagem para no invalid syntax, sem a dica. Como resolver: if, em minúsculas.

Missão final: o aviso da padaria

Missão: este programa tem três erros: os dois-pontos esquecidos, um recuo a mais e uma palavra com a maiúscula errada. Conserte um de cada vez, lendo a mensagem, até aparecerem as três linhas: A padaria está aberta., Pão quentinho saindo agora! e Até logo!.

aberta = true
if aberta
    print("A padaria está aberta.")
      print("Pão quentinho saindo agora!")
print("Até logo!")
aberta = True
if aberta:
    print("A padaria está aberta.")
    print("Pão quentinho saindo agora!")
print("Até logo!")

Repare na ordem em que as mensagens aparecem: primeiro SyntaxError: expected ':' (linha 2), depois IndentationError: unexpected indent (linha 4: 6 espaços num bloco de 4) e, só quando a sintaxe estiver toda certa, o NameError do true (linha 1). O NameError vem por último, mesmo estando na primeira linha, porque ele só aparece quando o programa roda, e o programa só roda depois que o Python consegue ler o arquivo inteiro.


Referência rápida

RegraExemplo
Uma instrução por linha, sem ponto e vírgulaprint("Olá")
Maiúsculas importamnome ≠ Nome; True, e não true
Linha que abre um bloco termina com :if idade >= 18:
O bloco é recuado 4 espaços print("Pode votar.")
O bloco acaba quando o recuo voltaprint("Fim da consulta.") na margem
Espaços no meio da linha são livres (o costume: um de cada lado do sinal)2 + 3
Linha longa: quebre dentro de parêntesestotal = (10 * 0.75 ⏎ + 6.50)
Palavras reservadas não viram nomesclass, if, for… (keyword.kwlist)
MensagemCausa provável
SyntaxError: expected ':'Faltaram os dois-pontos no fim da linha
IndentationError: expected an indented block after 'if' statement on line NA linha depois dos dois-pontos não foi recuada
IndentationError: unexpected indentRecuo numa linha que não está em bloco nenhum (às vezes, espaços que vieram ao colar)
IndentationError: unindent does not match any outer indentation levelRecuo de tamanho diferente dos níveis que existem (ex.: 2 espaços num bloco de 4)
TabError: inconsistent use of tabs and spaces in indentationTab e espaços misturados no mesmo bloco
SyntaxError: invalid syntax. Did you mean 'if'?Palavra reservada com maiúscula ou digitada errado
NameError: name 'true' is not defined. Did you mean: 'True'?Maiúscula esquecida (ou trocada) num nome
Nenhum erro, mas o resultado está erradoUma linha dentro do bloco que deveria estar fora (ou o contrário): confira o recuo

Exercícios

1. O sinal que abre o bloco

Complete o que falta no fim da linha:

if idade >= 18

2. O recuo recomendado

Quantos espaços a PEP 8 recomenda para cada nível de indentação?

espaços

3. Verdadeiro

Complete com o jeito certo de escrever "verdadeiro" em Python:

aberta =

4. No programa abaixo, com idade = 15, o que aparece na tela?

idade = 15
if idade >= 18:
    print("A")
    print("B")
print("C")

5. A mensagem foi IndentationError: unexpected indent. O que provavelmente aconteceu?

6. Por que o Python dá TabError quando um bloco mistura Tab e espaços?


Resumo

  • Sintaxe é a gramática da linguagem. No Python: uma instrução por linha, sem ponto e vírgula; linhas em branco não contam.
  • Maiúsculas importam: nome ≠ Nome, print ≠ Print. Só True, False e None começam com maiúscula.
  • Os dois-pontos abrem um bloco; as linhas recuadas embaixo deles formam o bloco; o bloco acaba quando o recuo volta.
  • O recuo muda o significado do programa, às vezes sem erro nenhum: confira a qual bloco cada linha pertence.
  • Use sempre 4 espaços (a PEP 8) e nunca misture com Tab.
  • Espaços no meio da linha são livres; linhas longas se quebram dentro de parênteses; as 35 palavras reservadas não podem virar nomes.
  • Erros de sintaxe e de indentação (SyntaxError, IndentationError, TabError) impedem o programa inteiro de rodar. O Python 3.14 sugere a palavra certa quando você digita uma palavra reservada errado.
  • Próximo passo: deixar recados para quem lê o código, em Comentários.