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.
- 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,NomeeNOMEsã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.
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'?
| Certo | Errado | Por quê |
|---|---|---|
print | Print, PRINT | As funções do Python são em minúsculas |
if, for, while | If, For, While | As palavras da linguagem também |
True, False, None | true, false, none | Essas três são as exceções: começam com maiúscula |
nome sempre igual | nome num lugar, Nome em outro | Uma 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ível | Recuo | Exemplo |
|---|---|---|
| Fora de qualquer bloco | 0 espaços | if idade >= 18: |
| Dentro de um bloco | 4 espaços | print("Pode votar.") |
| Um bloco dentro de outro | 8 espaços | Você 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".
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.")
| Forma | Quando usar |
|---|---|
| 4 espaços | Sempre. É 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-pontos | Funciona 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).
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:.
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.
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.
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).
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
| Regra | Exemplo |
|---|---|
| Uma instrução por linha, sem ponto e vírgula | print("Olá") |
| Maiúsculas importam | nome ≠ 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 volta | print("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ênteses | total = (10 * 0.75 ⏎ + 6.50) |
| Palavras reservadas não viram nomes | class, if, for… (keyword.kwlist) |
| Mensagem | Causa provável |
|---|---|
SyntaxError: expected ':' | Faltaram os dois-pontos no fim da linha |
IndentationError: expected an indented block after 'if' statement on line N | A linha depois dos dois-pontos não foi recuada |
IndentationError: unexpected indent | Recuo 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 level | Recuo de tamanho diferente dos níveis que existem (ex.: 2 espaços num bloco de 4) |
TabError: inconsistent use of tabs and spaces in indentation | Tab 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á errado | Uma 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:
2. O recuo recomendado
Quantos espaços a PEP 8 recomenda para cada nível de indentação?
3. Verdadeiro
Complete com o jeito certo de escrever "verdadeiro" em Python:
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,FalseeNonecomeç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.