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.
- 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
ifseguidos 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,TabErrore oTypeErrorde comparar o texto doinput()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:
- A pergunta: "está chovendo?". A resposta só pode ser sim ou não.
- O que fazer só se a resposta for sim: pegar o guarda-chuva.
- 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,
TrueouFalse. 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
ifcomeç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 doif. - o bloco
- As duas linhas com
printrecuadas formam o bloco doif. 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.
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.
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 derFalse. - 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 falso | Conta como verdadeiro |
|---|---|
False, None | True |
o zero: 0, 0.0 | qualquer 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.
"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 longo | Jeito mais curto | Qual 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.
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 arquivodois_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:.
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:.
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.
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'?".
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 entrestr(texto) eint(inteiro)". Oinput()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
| Escrita | O que faz |
|---|---|
if condição: + bloco recuado | Roda o bloco só se a condição for verdadeira |
| 4 espaços de recuo | Marcam as linhas que fazem parte do bloco |
| Linha de volta à margem | Encerra 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) |
pass | Não faz nada; guarda o lugar de um bloco ainda vazio |
| Mensagem | Causa provável |
|---|---|
SyntaxError: expected ':' | Faltaram os dois-pontos no fim da linha do if |
IndentationError: expected an indented block after 'if' statement on line N | O bloco não foi recuado, ou só tem comentário |
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? | = no lugar de == |
IndentationError: unexpected indent | Uma linha recuada a mais |
IndentationError: unindent does not match any outer indentation level | Recuos diferentes no mesmo bloco |
TabError: inconsistent use of tabs and spaces in indentation | Tab 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 sempre | Ela 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:
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?
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
iftermina 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,"",NoneeFalsecontam como falsos; o resto, como verdadeiro. - Vários
ifseguidos são perguntas independentes: mais de um bloco pode rodar. passguarda 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 oTypeErrorde comparar o texto doinput()com um número.