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").

Você vai aprender
  • A escrever um if … else e a regra de ouro: exatamente um dos dois blocos roda.
  • Por que o else não tem condição, e onde ele fica (alinhado com o if).
  • A dar um valor a uma variável nos dois caminhos.
  • Por que dois if com condições "opostas" não são o mesmo que um if/else.
  • Os erros reais do Python 3.14: else sem if, else com condição, else recuado, else sem 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 estradaNo Python
"Vai para a praia?"A condição do if
Caminho da esquerdaO bloco do if: roda quando a condição é True
Caminho da direitaO bloco do else: roda quando a condição é False
As estradas se juntamA 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 do if (sem recuo), e também termina com dois-pontos. Ele não tem condição: o else é "todo o resto", ou seja, todos os casos em que a condição do if deu False.
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.
A regra de ouro

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".

Só um exemplo

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
FormaQuando usar
if/else completoO jeito mais claro, e o único quando cada caminho faz várias coisas (como o frete da seção 4)
Valor padrão + ifQuando existe um valor "normal" e só um caso especial muda ele
if em uma linhaQuando cada caminho só escolhe um valor. É o assunto da aula if em uma Linha
Dois if com condições opostasEvite: 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.

Uma linha entre o bloco do 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).

Esqueceu os dois-pontos do 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 :.

O bloco do 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

EscritaO que faz
if condição: + blocoRoda o bloco quando a condição é verdadeira
else: + blocoRoda o bloco quando a condição do if é falsa
else na coluna do ifLiga o else ao if certo
Linha de volta à margem depois do elseOs dois caminhos se juntam; roda sempre
MensagemCausa provável
SyntaxError: invalid syntax, marcando o elseelse sem if: sozinho, com uma linha na margem antes dele, ou recuado para dentro do bloco do if
SyntaxError: expected ':', marcando depois do elseelse com condição, ou sem os dois-pontos
IndentationError: expected an indented block after 'else' statement on line NO bloco do else não foi recuado
Os dois blocos rodaramNã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:

if idade >= 18:
    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.

Resposta:

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á ao if um segundo caminho: roda quando a condição é falsa.
  • Num if/else roda exatamente um dos dois blocos; depois, o programa segue na primeira linha de volta à margem.
  • O else não tem condição, termina com dois-pontos e fica na mesma coluna do if, logo depois do bloco dele.
  • Variáveis criadas dentro dos blocos continuam existindo depois deles; dê valor a elas nos dois caminhos.
  • Dois if com condições "opostas" são perguntas independentes e podem rodar os dois; com else, isso não acontece.
  • Erros clássicos: else solto ou recuado (invalid syntax), else com condição ou sem dois-pontos (expected ':'), bloco sem recuo (expected an indented block after 'else').