Python if e else
Na aula if, o programa fazia algo só quando a condição era verdadeira; quando era falsa, ele não fazia nada de especial. Muitas vezes, porém, você quer fazer uma coisa ou outra: se a nota é 7 ou mais, "Aprovada"; senão, "Reprovada". Se a senha está certa, entra; senão, "Acesso negado". Para o "senão" existe o else (em inglês, "senão", "caso contrário").
- A escrever um
if…elsee a regra de ouro: exatamente um dos dois blocos roda. - Por que o
elsenão tem condição, e onde ele fica (alinhado com oif). - A dar um valor a uma variável nos dois caminhos.
- Por que dois
ifcom condições "opostas" não são o mesmo que umif/else. - Os erros reais do Python 3.14:
elsesemif,elsecom condição,elserecuado,elsesem dois-pontos e o bloco vazio.
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: a bifurcação na estrada
A Ana está dirigindo e chega numa bifurcação. Uma placa diz: "Se vai para a praia, siga pela esquerda; senão, siga pela direita". Ela lê a placa, responde à pergunta e segue um dos caminhos. Nunca os dois, e nunca nenhum. Um pouco adiante, as duas estradas se juntam de novo e a viagem continua.
O if com else é essa placa:
| Na estrada | No Python |
|---|---|
| "Vai para a praia?" | A condição do if |
| Caminho da esquerda | O bloco do if: roda quando a condição é True |
| Caminho da direita | O bloco do else: roda quando a condição é False |
| As estradas se juntam | A primeira linha depois dos dois blocos, de volta à margem |
1. Aprovada ou reprovada
nota = float(input("Digite a nota da prova: "))
if nota >= 7:
print("Aprovada!")
else:
print("Reprovada. Faltaram", 7 - nota, "pontos.")
print("Boletim fechado.")
$ python3 aprovacao.py Digite a nota da prova: 9 Aprovada! « 9 >= 7 é True: rodou o bloco do if Boletim fechado. $ python3 aprovacao.py Digite a nota da prova: 5.5 Reprovada. Faltaram 1.5 pontos. « 5.5 >= 7 é False: rodou o bloco do else Boletim fechado.
- if nota >= 7:
- A pergunta, como na aula anterior, com os dois-pontos no fim.
- o bloco do if
- As linhas recuadas logo abaixo. Rodam quando a resposta é
True. - else:
- "Senão". Vem logo depois do bloco do
if, na mesma coluna doif(sem recuo), e também termina com dois-pontos. Ele não tem condição: oelseé "todo o resto", ou seja, todos os casos em que a condição doifdeuFalse. - o bloco do else
- As linhas recuadas abaixo do
else:. Rodam quando a resposta éFalse. - 7 - nota
- Dentro do bloco você faz contas normalmente. A conta só acontece no caminho do
else. - print("Boletim fechado.")
- De volta à margem: os dois caminhos se juntam aqui. Essa linha roda sempre.
Num if/else, roda exatamente um dos dois blocos. Nunca os dois, nunca nenhum. Não existe nota que seja ao mesmo tempo "maior ou igual a 7" e "não maior ou igual a 7".
Um detalhe dos números: 6.9
Olhe o que acontece com a nota 6.9:
$ python3 aprovacao.py Digite a nota da prova: 6.9 Reprovada. Faltaram 0.09999999999999964 pontos. Boletim fechado.
O if/else funcionou certinho (6.9 é menor que 7). O número estranho vem da conta 7 - 6.9: o computador guarda os números com casas decimais de um jeito que nem sempre é exato (a aula Números explica). Para mostrar, arredonde na f-string:
nota = float(input("Digite a nota da prova: "))
if nota >= 7:
print("Aprovada!")
else:
print(f"Reprovada. Faltaram {7 - nota:.1f} pontos.")
print("Boletim fechado.")
$ python3 aprovacao2.py Digite a nota da prova: 6.9 Reprovada. Faltaram 0.1 pontos. Boletim fechado.
2. Blocos com várias linhas: a senha
Os dois blocos podem ter quantas linhas quiserem, e não precisam ter o mesmo tamanho. A Ana fez um programa para a padaria, que só mostra as encomendas para quem sabe a senha:
senha = input("Senha: ")
if senha == "pao123":
print("Bem-vinda, Ana!")
print("Você tem 3 encomendas para hoje.")
else:
print("Senha errada. Acesso negado.")
$ python3 senha.py Senha: pao123 Bem-vinda, Ana! Você tem 3 encomendas para hoje. $ python3 senha.py Senha: Pao123 Senha errada. Acesso negado. « P maiúsculo: para o Python, é outro texto
Comparar textos com == é exato: maiúsculas, acentos e espaços contam (aula Comparações). Por isso "Pao123" não é igual a "pao123".
Uma senha escrita no meio do código, como aqui, serve para aprender o if/else, mas não é segura: qualquer pessoa que abrir o arquivo vê a senha. Programas de verdade guardam senhas de outro jeito.
Experimente: clique em Rodar e digite uma senha no terminal da caixa. Tente pao123, depois PAO123 e pao123 (com um espaço no fim). Depois troque a senha certa no código por outra e acrescente mais uma linha ao bloco do else, como print("Fale com a gerente.").
senha = input("Senha: ")
if senha == "pao123":
print("Bem-vinda, Ana!")
print("Você tem 3 encomendas para hoje.")
else:
print("Senha errada. Acesso negado.")
3. Par ou ímpar
Um clássico: um número é par quando o resto da divisão por 2 é zero. O resto se calcula com % (aula Operadores Aritméticos):
numero = int(input("Digite um número inteiro: "))
if numero % 2 == 0:
print(numero, "é par.")
else:
print(numero, "é ímpar.")
$ python3 par.py Digite um número inteiro: 10 10 é par. $ python3 par.py Digite um número inteiro: 7 7 é ímpar. $ python3 par.py Digite um número inteiro: -3 -3 é ímpar. « no Python, -3 % 2 dá 1: funciona com negativos
Missão: este programa só avisa quando o número é par; para os ímpares ele fica calado. Acrescente um else que mostre que o número é ímpar. A entrada preparada é 7, e a saída esperada é 7 é ímpar.
numero = int(input("Digite um número inteiro: "))
if numero % 2 == 0:
print(numero, "é par.")
numero = int(input("Digite um número inteiro: "))
if numero % 2 == 0:
print(numero, "é par.")
else:
print(numero, "é ímpar.")
4. Um valor para cada caminho: o frete
Na aula if, o frete começava em R$ 15,00 e o if trocava para zero. Com o else, cada caminho dá o seu valor, e o bloco do else ainda pode fazer coisas que só interessam a quem não ganhou o frete grátis:
total = float(input("Total da compra: R$ "))
if total >= 100:
frete = 0.0
print("Frete grátis!")
else:
frete = 15.0
falta = 100 - total
print(f"Faltam R$ {falta:.2f} para o frete grátis.")
print(f"Total a pagar: R$ {total + frete:.2f}")
$ python3 frete.py Total da compra: R$ 130 Frete grátis! Total a pagar: R$ 130.00 $ python3 frete.py Total da compra: R$ 72.5 Faltam R$ 27.50 para o frete grátis. Total a pagar: R$ 87.50
Repare que a variável frete é criada dentro dos blocos, e mesmo assim a última linha consegue usá-la. No Python, o bloco do if não esconde as variáveis: o que foi criado lá dentro continua existindo depois. Como os dois caminhos dão um valor a frete, ela sempre existe quando chega na última linha. A variável falta, ao contrário, só existe quando o programa passou pelo else.
5. Dois if não são um if/else
Dá vontade de escrever o "senão" com um segundo if, com a condição contrária. Às vezes funciona, mas é fácil errar a condição. A Ana tentou:
nota = 7
if nota >= 7:
print("Aprovada")
if nota <= 7:
print("Reprovada")
$ python3 dois_ifs.py Aprovada Reprovada « aprovada E reprovada ao mesmo tempo!
O contrário de >= 7 é < 7, e não <= 7. Com a nota exatamente 7, as duas perguntas responderam "sim", e os dois blocos rodaram (lembre da aula anterior: dois if são perguntas independentes). Com else, esse erro é impossível: você escreve a condição uma vez só, e o else cuida de todo o resto.
Formas diferentes de fazer a mesma escolha
Os três programas abaixo mostram o mesmo frete:
if total >= 100:
frete = 0.0
else:
frete = 15.0
frete = 15.0
if total >= 100:
frete = 0.0
frete = 0.0 if total >= 100 else 15.0
| Forma | Quando usar |
|---|---|
if/else completo | O jeito mais claro, e o único quando cada caminho faz várias coisas (como o frete da seção 4) |
Valor padrão + if | Quando existe um valor "normal" e só um caso especial muda ele |
if em uma linha | Quando cada caminho só escolhe um valor. É o assunto da aula if em uma Linha |
Dois if com condições opostas | Evite: você escreve a condição duas vezes e pode errar uma delas (seção 5) |
Quando dá errado
O else precisa estar grudado num if: logo depois do bloco dele, na mesma coluna. Quase todos os erros vêm daí. Todos são erros de escrita, avisados antes de o programa rodar.
else sem if
nota = 5
print("Corrigindo a prova...")
else:
print("Reprovada")
$ python3 else_sozinho.py
File "/home/ana/else_sozinho.py", line 3
else:
^^^^
SyntaxError: invalid syntax
"Sintaxe inválida", com a marca embaixo do else. Um else sozinho não quer dizer nada: "senão" do quê? Como consertar: todo else vem depois de um if.
if e o else
nota = 5
if nota >= 7:
print("Aprovada")
print("----------")
else:
print("Reprovada")
$ python3 linha_no_meio.py
File "/home/ana/linha_no_meio.py", line 5
else:
^^^^
SyntaxError: invalid syntax
É o mesmo erro do caso anterior, por um motivo menos óbvio. A linha 4 voltou para a margem, então o if terminou ali. Quando o Python chega no else da linha 5, o if já acabou, e o else ficou sozinho. Como consertar: o else vem imediatamente depois do bloco do if. Se a linha de traços deve aparecer sempre, mova-a para depois do bloco do else.
else recuado, dentro do bloco do if
nota = 5
if nota >= 7:
print("Aprovada")
else:
print("Reprovada")
$ python3 else_recuado.py
File "/home/ana/else_recuado.py", line 4
else:
^^^^
SyntaxError: invalid syntax
Com 4 espaços, o else ficou dentro do bloco do if, como se fosse uma instrução qualquer, e lá não existe if para ele acompanhar. Como consertar: o else: fica na mesma coluna do if a que pertence.
else com condição
nota = 5
if nota >= 7:
print("Aprovada")
else nota < 7:
print("Reprovada")
$ python3 else_condicao.py
File "/home/ana/else_condicao.py", line 4
else nota < 7:
^^^^
SyntaxError: expected ':'
"Era esperado um :", com a marca embaixo de nota. O Python esperava os dois-pontos logo depois do else, porque o else nunca tem condição: ele já quer dizer "em todos os outros casos". Como consertar: apague a condição e deixe só else:. Se você precisa mesmo de uma segunda condição, quem faz isso é o elif, da próxima aula (elif).
else
nota = 5
if nota >= 7:
print("Aprovada")
else
print("Reprovada")
$ python3 else_sem_dois_pontos.py
File "/home/ana/else_sem_dois_pontos.py", line 4
else
^
SyntaxError: expected ':'
A mesma mensagem, agora com a setinha logo depois do else, onde faltam os dois-pontos. O else também abre um bloco, então também precisa de :.
else sem recuo
nota = 5
if nota >= 7:
print("Aprovada")
else:
print("Reprovada")
$ python3 else_vazio.py
File "/home/ana/else_vazio.py", line 5
print("Reprovada")
^^^^^
IndentationError: expected an indented block after 'else' statement on line 4
"Era esperado um bloco recuado depois do else da linha 4". É o mesmo erro da aula if, agora para o else. Como consertar: recue o print com 4 espaços.
Missão: o programa não roda. Leia a mensagem de erro e conserte o else. A entrada preparada é 5, e o programa deve mostrar Reprovada.
nota = float(input("Nota: "))
if nota >= 7:
print("Aprovada")
else nota < 7:
print("Reprovada")
nota = float(input("Nota: "))
if nota >= 7:
print("Aprovada")
else:
print("Reprovada")
Referência rápida
| Escrita | O que faz |
|---|---|
if condição: + bloco | Roda o bloco quando a condição é verdadeira |
else: + bloco | Roda o bloco quando a condição do if é falsa |
else na coluna do if | Liga o else ao if certo |
Linha de volta à margem depois do else | Os dois caminhos se juntam; roda sempre |
| Mensagem | Causa provável |
|---|---|
SyntaxError: invalid syntax, marcando o else | else sem if: sozinho, com uma linha na margem antes dele, ou recuado para dentro do bloco do if |
SyntaxError: expected ':', marcando depois do else | else com condição, ou sem os dois-pontos |
IndentationError: expected an indented block after 'else' statement on line N | O bloco do else não foi recuado |
| Os dois blocos rodaram | Não era um if/else, eram dois if com condições que se sobrepõem |
Exercícios
1. Complete o "senão"
Complete a palavra e o sinal que faltam:
print("Maior de idade")
print("Menor de idade")
2. Quantos blocos rodam?
Num if/else, quantos dos dois blocos rodam a cada vez? Responda com um número.
3. O que este programa mostra?
estoque = 0
if estoque > 0:
print("Disponível")
else:
print("Esgotado")
print("Fim")
4. Qual destas linhas está certa?
5. Por que, com a nota 7, o dois_ifs.py da seção 5 mostrou "Aprovada" e "Reprovada"?
Missão final: o ingresso do cinema
Missão: o cinema do bairro cobra R$ 30.00 a entrada inteira, e meia-entrada (R$ 15.00) para quem tem menos de 18 anos ou 60 anos ou mais. Escreva um if/else que mostre Meia-entrada: R$ 15.00 ou Inteira: R$ 30.00. A entrada preparada é 65. Dica: a condição usa or.
idade = int(input("Idade: "))
# escreva o if/else aqui
idade = int(input("Idade: "))
if idade < 18 or idade >= 60:
print("Meia-entrada: R$ 15.00")
else:
print("Inteira: R$ 30.00")
No lab, a solução mostrou Meia-entrada: R$ 15.00 para 65 anos e Inteira: R$ 30.00 para 30. E quando são três preços (criança, adulto, idoso)? Aí são três caminhos, e é a vez do elif.
Resumo
else("senão") dá aoifum segundo caminho: roda quando a condição é falsa.- Num
if/elseroda exatamente um dos dois blocos; depois, o programa segue na primeira linha de volta à margem. - O
elsenão tem condição, termina com dois-pontos e fica na mesma coluna doif, logo depois do bloco dele. - Variáveis criadas dentro dos blocos continuam existindo depois deles; dê valor a elas nos dois caminhos.
- Dois
ifcom condições "opostas" são perguntas independentes e podem rodar os dois; comelse, isso não acontece. - Erros clássicos:
elsesolto ou recuado (invalid syntax),elsecom condição ou sem dois-pontos (expected ':'), bloco sem recuo (expected an indented block after 'else').