Python if

Até aqui, os seus programas faziam sempre a mesma coisa: rodavam todas as linhas, de cima para baixo, uma vez cada. Um programa de verdade precisa decidir. Se a nota da prova é 7 ou mais, a aluna passou. Se a compra passou de R$ 100, o frete é grátis. Se a pessoa tem 16 anos ou mais, ela já pode votar. Para isso existe o if (em inglês, "se"): ele roda um pedaço do programa só quando uma condição é verdadeira.

Você vai aprender
  • A escrever um if: a condição, os dois-pontos e o bloco recuado.
  • Como o Python sabe onde o bloco começa e termina: a indentação (o recuo de 4 espaços).
  • O que pode ser uma condição: comparações, and/or, e qualquer valor (o que conta como "verdadeiro" e "falso").
  • Que vários if seguidos são testados um por um, cada um por conta própria.
  • Para que serve o pass.
  • Os erros reais do Python 3.14: expected ':', expected an indented block, Maybe you meant '==', unexpected indent, TabError e o TypeError de comparar o texto do input() com um número.

Todos os programas desta aula rodaram no Python 3.14 do computador fictício da Ana (usuária ana, computador notebook), na pasta pessoal dela, com python3 arquivo.py.


A ideia: "se chover, leve o guarda-chuva"

Antes de sair de casa, a Ana olha pela janela. Se estiver chovendo, ela pega o guarda-chuva. Se não estiver, ela não faz nada de especial. Em qualquer caso, depois ela sai de casa.

Repare nas três partes dessa frase:

  1. A pergunta: "está chovendo?". A resposta só pode ser sim ou não.
  2. O que fazer só se a resposta for sim: pegar o guarda-chuva.
  3. O que vem depois, aconteça o que acontecer: sair de casa.

O if do Python tem exatamente essas três partes. A pergunta se chama condição. As respostas "sim" e "não" você já conhece da aula Booleanos: são True (verdadeiro) e False (falso). E as perguntas você já sabe fazer com as comparações (>=, ==, <…).


1. O primeiro if: a nota da prova

A escola da Ana aprova quem tira 7 ou mais. Este programa pergunta a nota (com o input(), da aula input(): Lendo o Teclado) e dá os parabéns só para quem passou:

nota = float(input("Digite a nota da prova: "))
if nota >= 7:
    print("Parabéns, você passou!")
    print("Sua nota foi", nota)
print("Fim do boletim.")
$ python3 nota.py
Digite a nota da prova: 8.5
Parabéns, você passou!          « 8.5 >= 7 é True: o bloco rodou
Sua nota foi 8.5
Fim do boletim.
$ python3 nota.py
Digite a nota da prova: 5
Fim do boletim.                 « 5 >= 7 é False: o bloco foi pulado

Com 8.5, as duas linhas de dentro do if rodaram. Com 5, o Python pulou as duas e foi direto para Fim do boletim., que roda sempre, porque está fora do if. Vamos olhar cada pedaço:

if
Palavra reservada do Python: "se". Sempre em minúsculas.
nota >= 7
A condição: "a nota é maior ou igual a 7?". O Python calcula a resposta, True ou False. Não precisa de parênteses em volta (em C e em Java precisa; no Python, não).
:
Os dois-pontos fecham a linha do if. Eles querem dizer "agora vem o bloco". Esquecer os dois-pontos é o erro número 1 de quem está começando (veja Quando dá errado).
os 4 espaços
As linhas de dentro do if começam 4 espaços mais para a direita. Esse recuo se chama indentação, e no Python ele não é enfeite: é ele que diz quais linhas fazem parte do if.
o bloco
As duas linhas com print recuadas formam o bloco do if. Ou rodam as duas, ou nenhuma.
print("Fim do boletim.")
Esta linha voltou para a margem esquerda: o bloco acabou. Ela já não depende da condição.
Por que float(input(…))?

O input() sempre devolve um texto, mesmo que a pessoa digite números. Para comparar com 7, é preciso converter o texto em número: float() para números com casas decimais (como 8.5), int() para inteiros (como uma idade). Isso está na aula Conversão de Tipos. A seção Quando dá errado mostra o que acontece quando você esquece.

A condição é um True ou False

No modo interativo (aula O Modo Interativo) dá para ver a pergunta e a resposta separadas do if:

$ python3
Python 3.14.4 (main, Aug 20 2026, 10:41:58) [GCC 15.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> nota = 8.5
>>> nota >= 7
True
>>> type(nota >= 7)
<class 'bool'>
>>> exit()

O if só olha essa resposta: True, roda o bloco; False, pula. Também dá para escrever um if no modo interativo. Depois dos dois-pontos o prompt vira ... ("continue"), você digita o bloco recuado e, no fim, aperta Enter numa linha vazia para avisar que o bloco acabou:

>>> nota = 8
>>> if nota >= 7:
...     print("Passou!")
...                              « linha vazia: o bloco acabou
Passou!

Experimente: clique em Rodar e digite uma nota no terminal da caixa. Rode várias vezes: com 9, com 7 (repare que 7 também passa, porque a condição é "maior ou igual"), com 6.9 e com 3. Depois troque o 7 por 6 e veja quem passa a ser aprovado.

nota = float(input("Digite a nota da prova: "))
if nota >= 7:
    print("Parabéns, você passou!")
    print("Sua nota foi", nota)
print("Fim do boletim.")

2. A indentação: onde o bloco começa e termina

Em muitas linguagens, o bloco fica entre chaves { }. No Python, não: o recuo é o bloco. Todas as linhas seguidas com o mesmo recuo, logo abaixo dos dois-pontos, pertencem ao if. A primeira linha que volta para a margem de antes encerra o bloco.

temperatura = 33
print("Hoje faz", temperatura, "graus.")
if temperatura > 30:
    print("Que calor!")

    print("Beba bastante água.")
print("Tenha um bom dia.")
$ python3 bloco.py
Hoje faz 33 graus.
Que calor!
Beba bastante água.
Tenha um bom dia.
  • As linhas 4 e 6 estão recuadas: são o bloco do if.
  • A linha em branco no meio (linha 5) não encerra o bloco. O Python ignora linhas vazias dentro de um arquivo; quem encerra o bloco é a linha 7, que voltou para a margem.
  • Troque a temperatura para 20: só aparecem a primeira e a última linha.
Regra do guia: 4 espaços, sempre

O Python aceita qualquer recuo (2 espaços, 8 espaços, um Tab), desde que todas as linhas do mesmo bloco tenham o mesmo recuo. Mas o costume de todo mundo, escrito no guia de estilo oficial (a PEP 8), é 4 espaços. Quase todo editor de código já faz isso sozinho: você aperta Enter depois dos dois-pontos e ele recua a próxima linha; aperta a tecla Tab e ele põe 4 espaços. Nunca misture Tab e espaços no mesmo arquivo: o Python recusa (veja o TabError mais abaixo).

Uma linha a menos de recuo muda tudo

Como o recuo decide o que está dentro do if, uma linha no recuo errado não dá erro nenhum: o programa simplesmente faz outra coisa. A Ana queria cancelar a compra quando ela fosse maior que o saldo:

saldo = 100
compra = 30
if compra > saldo:
    print("Saldo insuficiente!")
print("Compra cancelada.")
$ python3 fora.py
Compra cancelada.               « a compra cabia no saldo, mas foi cancelada!

O print("Compra cancelada.") ficou na margem, fora do bloco, e por isso roda sempre. O Python não tem como adivinhar a intenção da Ana. O conserto é recuar a linha 5 com 4 espaços, para ela entrar no bloco.


3. Vários if seguidos

Um programa pode ter quantos if quiser. Cada um é uma pergunta separada, testada na sua vez, sem olhar o que os outros responderam. No Brasil, votar é permitido a partir dos 16 anos e obrigatório a partir dos 18:

idade = int(input("Quantos anos você tem? "))
if idade >= 16:
    print("Você já pode votar.")
if idade >= 18:
    print("Para você, votar é obrigatório.")
if idade < 16:
    print("Ainda não dá para votar.")
print("Obrigado por responder!")
$ python3 voto.py
Quantos anos você tem? 20
Você já pode votar.                « 20 >= 16: sim
Para você, votar é obrigatório.    « 20 >= 18: sim também
Obrigado por responder!
$ python3 voto.py
Quantos anos você tem? 17
Você já pode votar.                « 17 >= 16: sim; 17 >= 18: não
Obrigado por responder!
$ python3 voto.py
Quantos anos você tem? 14
Ainda não dá para votar.           « só o terceiro if deu True
Obrigado por responder!

Com 20 anos, dois blocos rodaram, porque as duas primeiras perguntas tiveram resposta "sim". Os três if são independentes: o Python testa o primeiro, depois o segundo, depois o terceiro, sempre. Quando você quiser que só um caminho seja escolhido (ou isto, ou aquilo), o certo é o else e o elif, das próximas aulas: if e else e elif.


4. Mudar valores dentro do bloco: o frete grátis

O bloco do if pode ter qualquer coisa: contas, novas variáveis, outros print. A loja da Ana cobra R$ 15,00 de frete, mas dá frete grátis para compras a partir de R$ 100:

total = float(input("Total da compra: R$ "))
frete = 15.0
if total >= 100:
    frete = 0.0
    print("Parabéns: o frete é grátis!")
print(f"Frete: R$ {frete:.2f}")
print(f"Total a pagar: R$ {total + frete:.2f}")
$ python3 frete.py
Total da compra: R$ 120
Parabéns: o frete é grátis!
Frete: R$ 0.00
Total a pagar: R$ 120.00
$ python3 frete.py
Total da compra: R$ 80
Frete: R$ 15.00                 « o if não rodou: o frete continuou 15.0
Total a pagar: R$ 95.00
frete = 15.0
O valor normal, guardado antes do if. É o que vale se a condição der False.
frete = 0.0
Dentro do bloco, o valor é trocado. Isso só acontece quando a compra é de R$ 100 ou mais.
{frete:.2f}
A f-string mostra o número com duas casas decimais.

Esse jeito (dar um valor padrão e trocar no if) é muito comum. Outro jeito de escrever a mesma coisa, com else, está na próxima aula.

Missão: a padaria do bairro também quer dar frete grátis nas encomendas a partir de R$ 100. A entrada preparada é 150. Acrescente um if que mostre Frete grátis! quando o total for maior ou igual a 100.

total = float(input("Total da encomenda: R$ "))
print(f"Encomenda de R$ {total:.2f} registrada.")
total = float(input("Total da encomenda: R$ "))
print(f"Encomenda de R$ {total:.2f} registrada.")
if total >= 100:
    print("Frete grátis!")

5. O que pode ser uma condição

Comparações, sozinhas ou juntas

A condição mais comum é uma comparação, mas você pode juntar várias com and ("e") e or ("ou"), da aula and, or e not. Uma nota só vale se estiver entre 0 e 10:

nota = float(input("Nota (0 a 10): "))
if nota < 0 or nota > 10:
    print("Nota inválida!")
if 0 <= nota <= 10:
    print("Nota registrada:", nota)
$ python3 faixa.py
Nota (0 a 10): 11
Nota inválida!                  « 11 > 10: o or deu True
$ python3 faixa.py
Nota (0 a 10): 7.5
Nota registrada: 7.5            « 0 <= 7.5 <= 10: True

O 0 <= nota <= 10 é uma comparação encadeada: o Python lê como na matemática, "nota entre 0 e 10", e é o mesmo que 0 <= nota and nota <= 10.

Qualquer valor: "verdadeiro" e "falso"

O if aceita qualquer valor como condição, não só True e False. Quando não é um booleano, o Python pergunta ao valor se ele é "verdadeiro" ou "falso", do mesmo jeito que a função bool() faz:

>>> bool(0)
False
>>> bool(3)
True
>>> bool(-1)
True
>>> bool(0.0)
False
>>> bool("")
False
>>> bool("Ana")
True
>>> bool(" ")
True                             « um espaço já é um texto que não está vazio
>>> bool(None)
False
Conta como falsoConta como verdadeiro
False, NoneTrue
o zero: 0, 0.0qualquer outro número: 3, -1, 0.5
o texto vazio: ""qualquer texto com algo dentro: "Ana", " ", "0"
coleções vazias (listas, dicionários…, que você vai ver no Nível 2)coleções com pelo menos um item

Isso permite um atalho muito usado: if nome: quer dizer "se o nome não está vazio". Quando a pessoa só aperta Enter no input(), ele devolve o texto vazio "":

nome = input("Seu nome (ou Enter para pular): ")
if nome:
    print(f"Olá, {nome}!")
print("Bem-vindo à padaria do bairro.")
$ python3 saudacao.py
Seu nome (ou Enter para pular): Ana
Olá, Ana!
Bem-vindo à padaria do bairro.
$ python3 saudacao.py
Seu nome (ou Enter para pular):          « aqui a Ana só apertou Enter
Bem-vindo à padaria do bairro.
O texto "0" é verdadeiro

Cuidado: só o número zero é falso. O texto "0" (que é o que o input() devolve quando alguém digita 0) tem um caractere dentro, então é verdadeiro. No lab, print(bool("0"), bool("False")) mostrou True True. Se você quer saber se a pessoa digitou o número zero, converta primeiro: if int(texto) == 0:.


6. Um bloco que ainda não faz nada: pass

O bloco do if não pode ficar vazio: depois dos dois-pontos o Python exige pelo menos uma linha recuada. Quando você ainda não sabe o que vai pôr ali, use pass ("passar a vez"), uma instrução que não faz nada:

estoque = 3
if estoque < 5:
    pass  # depois: avisar o fornecedor
print("Relatório pronto.")
$ python3 pass_exemplo.py
Relatório pronto.

O comentário sozinho não serviria: o Python ignora comentários, e o bloco ficaria vazio (o erro aparece em Quando dá errado). O pass é um "guardador de lugar" para você voltar depois.


Formas diferentes de escrever a mesma condição

As condições de cada linha da tabela dão sempre a mesma resposta:

Jeito mais longoJeito mais curtoQual usar
if nome != "":if nome:O curto é o costume do Python para "não está vazio". O longo também está certo e pode ser mais claro no começo
if nota >= 0 and nota <= 10:if 0 <= nota <= 10:O encadeado: lê como na matemática
if (nota >= 7):if nota >= 7:Sem parênteses. Eles funcionam, mas não são necessários no Python (são costume de quem vem do C ou do Java)
if aprovado == True:if aprovado:Sem o == True: a variável já é True ou False

Quando dá errado

Quase todos os erros do if são de escrita (sintaxe): o Python lê o arquivo inteiro antes de rodar e, se achar algo que não sabe ler, recusa o programa sem rodar nenhuma linha. Repare que a mensagem não começa com Traceback: o programa nem começou.

Esqueceu os dois-pontos
nota = 8
if nota >= 7
    print("Passou!")
$ python3 dois_pontos.py
  File "/home/ana/dois_pontos.py", line 2
    if nota >= 7
                ^
SyntaxError: expected ':'

Linha por linha:

  • File "/home/ana/dois_pontos.py", line 2: o problema está no arquivo dois_pontos.py, na linha 2.
  • if nota >= 7: a linha com o problema, copiada.
  • ^: a setinha aponta o lugar exato: logo depois do 7, onde deveriam estar os dois-pontos.
  • SyntaxError: expected ':': "erro de sintaxe: era esperado um :". O Python diz exatamente o que falta.

Como consertar: if nota >= 7:.

Esqueceu o recuo
nota = 8
if nota >= 7:
print("Passou!")
$ python3 sem_recuo.py
  File "/home/ana/sem_recuo.py", line 3
    print("Passou!")
    ^^^^^
IndentationError: expected an indented block after 'if' statement on line 2

IndentationError é o "erro de indentação" (de recuo). A mensagem diz: "era esperado um bloco recuado depois do if da linha 2". O Python encontrou o print na margem, onde devia começar o bloco. O mesmo erro aparece quando o bloco tem só um comentário: comentário não conta como linha. Como consertar: recue o print com 4 espaços (ou, se o bloco ainda não tem nada, escreva pass).

= no lugar de ==
nota = 10
if nota = 10:
    print("Nota máxima!")
$ python3 igual.py
  File "/home/ana/igual.py", line 2
    if nota = 10:
       ^^^^^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

Um = só guarda um valor numa variável; para comparar são dois, ==. O Python percebe a confusão e dá a dica: "sintaxe inválida. Você quis dizer '==' ou ':=' em vez de '='?". Os ^^^^^^^^^ sublinham o trecho inteiro. (O :=, chamado "operador morsa", é um recurso mais avançado; quase sempre a resposta certa é o ==.) Como consertar: if nota == 10:.

Recuo sobrando ou torto

Uma linha recuada mais que as outras do bloco, sem um novo if que justifique:

nota = 8
if nota >= 7:
    print("Passou!")
        print("Parabéns!")
$ python3 recuo_sobrando.py
  File "/home/ana/recuo_sobrando.py", line 4
    print("Parabéns!")
IndentationError: unexpected indent

"Recuo inesperado": a linha 4 tem 8 espaços, mas nada pedia um bloco novo ali. E quando a linha volta para um recuo que não existe antes dela:

nota = 8
if nota >= 7:
        print("Passou!")
    print("Parabéns!")
$ python3 recuo_torto.py
  File "/home/ana/recuo_torto.py", line 4
    print("Parabéns!")
                      ^
IndentationError: unindent does not match any outer indentation level

"O recuo não bate com nenhum nível de fora". O bloco começou com 8 espaços; a linha 4 voltou para 4 espaços, que não é nem o recuo do bloco (8) nem o da margem (0). O Python não sabe a que bloco ela pertence. Como consertar: as linhas do mesmo bloco têm de ter exatamente o mesmo recuo. Use 4 espaços em todas.

Tab e espaços misturados

No arquivo abaixo, a linha 3 foi recuada com 4 espaços e a linha 4 com um Tab. Na tela, as duas parecem iguais:

$ python3 tab.py
  File "/home/ana/tab.py", line 4
    	print("Parabéns!")
    ^
TabError: inconsistent use of tabs and spaces in indentation

"Uso inconsistente de tabs e espaços na indentação". O Python se recusa a adivinhar quantos espaços vale um Tab. Como consertar: configure o editor para pôr espaços quando você aperta Tab (quase todos já vêm assim para arquivos .py) e refaça o recuo da linha.

If com maiúscula
nota = 8
If nota >= 7:
    print("Passou!")
$ python3 maiuscula.py
  File "/home/ana/maiuscula.py", line 2
    If nota >= 7:
    ^^
SyntaxError: invalid syntax. Did you mean 'if'?

O Python diferencia maiúsculas de minúsculas. If não é palavra nenhuma para ele, e o Python 3.14 sugere: "Você quis dizer 'if'?".

Comparar o texto do input() com um número

Este erro é diferente: o programa começa a rodar e só quebra quando chega no if.

idade = input("Quantos anos você tem? ")
if idade >= 16:
    print("Você já pode votar.")
$ python3 texto_numero.py
Quantos anos você tem? 17
Traceback (most recent call last):
  File "/home/ana/texto_numero.py", line 2, in <module>
    if idade >= 16:
       ^^^^^^^^^^^
TypeError: '>=' not supported between instances of 'str' and 'int'
  • Traceback (most recent call last):: agora sim aparece o "rastro" do erro, porque o programa estava rodando (ele até perguntou a idade).
  • line 2, in <module>: na linha 2, no corpo principal do programa.
  • TypeError: erro de tipo. ">= não é suportado entre str (texto) e int (inteiro)". O input() devolveu o texto "17", e o Python não compara texto com número.

Como consertar: converta na hora de ler: idade = int(input("Quantos anos você tem? ")).

Missão: o programa abaixo tem três erros: um = que devia ser ==, os dois-pontos que faltam e o recuo do print. Rode, leia a mensagem, conserte um de cada vez e rode de novo. A entrada preparada é 16.

idade = int(input("Quantos anos você tem? "))
if idade = 16
print("Pode votar pela primeira vez!")
idade = int(input("Quantos anos você tem? "))
if idade == 16:
    print("Pode votar pela primeira vez!")

Referência rápida

EscritaO que faz
if condição: + bloco recuadoRoda o bloco só se a condição for verdadeira
4 espaços de recuoMarcam as linhas que fazem parte do bloco
Linha de volta à margemEncerra o bloco; roda sempre
if a and b: / if a or b:As duas condições / pelo menos uma
if 0 <= x <= 10:Comparação encadeada: x entre 0 e 10
if nome:Se o texto não está vazio (vale para qualquer valor: 0, "" e None são falsos)
passNão faz nada; guarda o lugar de um bloco ainda vazio
MensagemCausa provável
SyntaxError: expected ':'Faltaram os dois-pontos no fim da linha do if
IndentationError: expected an indented block after 'if' statement on line NO bloco não foi recuado, ou só tem comentário
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?= no lugar de ==
IndentationError: unexpected indentUma linha recuada a mais
IndentationError: unindent does not match any outer indentation levelRecuos diferentes no mesmo bloco
TabError: inconsistent use of tabs and spaces in indentationTab e espaços misturados
SyntaxError: invalid syntax. Did you mean 'if'?If com maiúscula
TypeError: '>=' not supported between instances of 'str' and 'int'Comparou o texto do input() com um número: faltou int() ou float()
Nenhum erro, mas uma linha roda sempreEla ficou fora do bloco (sem recuo)

Exercícios

1. Complete o if

Mostre "Pode votar" para quem tem 16 anos ou mais. Complete o operador e o sinal que fecha a linha:

if idade 16
    print("Pode votar")

2. Quantos espaços?

Quantos espaços de recuo o guia de estilo do Python (e este guia) recomenda para o bloco do if?

Resposta: espaços

3. O que este programa mostra?

saldo = 50
if saldo > 100:
    print("Saldo alto")
print("Fim")

4. Com idade = 20, quantas linhas o voto.py da seção 3 mostra, contando o "Obrigado por responder!"?

5. Qual destes valores faz o if valor: pular o bloco?

6. O Python respondeu SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?. O que aconteceu?

Missão final: o brinde da padaria

Missão: a padaria dá um pão de queijo de brinde em compras acima de R$ 30. O programa já lê o total (a entrada preparada é 45) e se despede. Acrescente, entre as duas linhas, um if que mostre Ganhou um pão de queijo de brinde! quando o total for maior que 30. O Volte sempre! tem de continuar aparecendo para todo mundo.

total = float(input("Total da compra: R$ "))
print("Volte sempre!")
total = float(input("Total da compra: R$ "))
if total > 30:
    print("Ganhou um pão de queijo de brinde!")
print("Volte sempre!")

Depois de cumprir a missão, copie o programa para um arquivo e rode no seu terminal com outros valores: 30, 30.01, 12. Com exatamente 30 não há brinde, porque a condição é "maior que", e não "maior ou igual".


Resumo

  • if ("se") roda um bloco só quando a condição é verdadeira; se for falsa, o bloco é pulado e o programa segue.
  • A linha do if termina com dois-pontos; o bloco vem embaixo, recuado com 4 espaços. A primeira linha que volta para a margem encerra o bloco.
  • No Python o recuo não é enfeite: uma linha fora do bloco roda sempre, sem erro nenhum.
  • A condição pode ser uma comparação, várias juntas com and/or, uma comparação encadeada (0 <= x <= 10) ou qualquer valor: 0, "", None e False contam como falsos; o resto, como verdadeiro.
  • Vários if seguidos são perguntas independentes: mais de um bloco pode rodar.
  • pass guarda o lugar de um bloco que ainda não faz nada.
  • Erros clássicos: expected ':', expected an indented block, Maybe you meant '==', unexpected indent, TabError, e o TypeError de comparar o texto do input() com um número.