Python elif

Com if e else, o programa escolhe entre dois caminhos. Mas a vida tem mais opções: a nota pode valer conceito A, B, C ou D; o frete pode ser grátis, R$ 10 ou R$ 20; o semáforo pode estar verde, amarelo ou vermelho. Para três, quatro ou mais caminhos existe o elif, abreviação de else if ("senão, se"). Nesta aula você também vai ver o detalhe que mais engana quem está começando: a ordem das condições importa.

Você vai aprender
  • A escrever uma escada de if … elif … elif … else.
  • Como o Python percorre a escada: de cima para baixo, parando na primeira condição verdadeira.
  • Por que a ordem das condições muda o resultado, e como escolher a ordem certa.
  • Que o else do fim é opcional, e o que acontece sem ele.
  • A diferença entre elif e vários if seguidos.
  • Os erros reais do Python 3.14: else if, elseif, elif depois do else, elif sem if e elif sem condição.

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 fila de perguntas

A professora da Ana corrige as provas e dá um conceito a cada uma. Para cada prova, ela faz as perguntas em ordem, e para na primeira resposta "sim":

  1. A nota é 9 ou mais? Se sim, conceito A, e acabou: ela pega a próxima prova.
  2. Se não: a nota é 7 ou mais? Se sim, conceito B, e acabou.
  3. Se não: a nota é 5 ou mais? Se sim, conceito C, e acabou.
  4. Se nenhuma pergunta deu "sim": conceito D.

Repare que, na pergunta 2, ela nem precisa conferir se a nota é menor que 9: se fosse 9 ou mais, ela já teria parado na pergunta 1. É exatamente assim que o elif funciona.


1. A escada de conceitos

nota = float(input("Nota da prova: "))
if nota >= 9:
    print("Conceito A: excelente!")
elif nota >= 7:
    print("Conceito B: aprovada.")
elif nota >= 5:
    print("Conceito C: recuperação.")
else:
    print("Conceito D: reprovada.")
print("Boletim fechado.")
$ python3 conceito.py
Nota da prova: 9.5
Conceito A: excelente!             « 9.5 >= 9: parou na primeira pergunta
Boletim fechado.
$ python3 conceito.py
Nota da prova: 7
Conceito B: aprovada.              « 7 >= 9 não; 7 >= 7 sim
Boletim fechado.
$ python3 conceito.py
Nota da prova: 5.5
Conceito C: recuperação.
Boletim fechado.
$ python3 conceito.py
Nota da prova: 3
Conceito D: reprovada.             « nenhuma deu True: rodou o else
Boletim fechado.
if nota >= 9:
A primeira pergunta. Toda escada começa com um if.
elif nota >= 7:
"Senão, se a nota é 7 ou mais". Só é testada se a pergunta de cima deu False. Tem condição própria e termina com dois-pontos, como o if.
elif nota >= 5:
Mais um degrau. Você pode pôr quantos elif quiser.
else:
"Senão": roda quando nenhuma condição acima deu True. É opcional e, se existir, é sempre o último.
a mesma coluna
if, os elif e o else ficam todos alinhados na mesma coluna. Cada um tem o seu bloco recuado embaixo.
A regra da escada

O Python testa as condições de cima para baixo e roda o bloco da primeira que der True. Os degraus de baixo nem são testados. Por isso, numa escada if/elif/else, roda no máximo um bloco (e exatamente um, quando há else).

Experimente: clique em Rodar e digite várias notas: 10, 9, 8.9, 7, 6.99, 5, 0. Antes de cada uma, tente adivinhar o conceito. Depois acrescente um degrau no topo: if nota == 10: mostrando "Nota máxima!" (e troque o if nota >= 9: de baixo por elif).

nota = float(input("Nota da prova: "))
if nota >= 9:
    print("Conceito A: excelente!")
elif nota >= 7:
    print("Conceito B: aprovada.")
elif nota >= 5:
    print("Conceito C: recuperação.")
else:
    print("Conceito D: reprovada.")
print("Boletim fechado.")

2. A ordem das condições importa

A Ana escreveu as mesmas perguntas, só que de baixo para cima, começando pelo conceito C:

nota = 9.5
if nota >= 5:
    print("Conceito C")
elif nota >= 7:
    print("Conceito B")
elif nota >= 9:
    print("Conceito A")
else:
    print("Conceito D")
$ python3 ordem_errada.py
Conceito C                         « 9.5 levou C!

Nenhum erro, e o resultado está errado. A primeira pergunta, 9.5 >= 5, deu True, e a escada parou ali. As perguntas de baixo, que dariam a resposta certa, nem foram feitas. Nessa ordem, os conceitos A e B ficaram impossíveis: toda nota que é 7 ou mais também é 5 ou mais, e já cai no primeiro degrau.

Como escolher a ordem

Quando as condições são do tipo "maior ou igual a", comece pela mais exigente (o número maior) e desça. A pergunta "mais difícil de cumprir" vem primeiro; a "mais fácil", por último. Com "menor que", é o contrário: comece pelo número menor e suba (veja Formas diferentes).

Missão: a escada abaixo está na ordem errada, e a nota preparada, 9.5, leva conceito C. Reorganize os degraus (só mude a ordem das condições e dos print) para que 9.5 dê Conceito A.

nota = float(input("Nota da prova: "))
if nota >= 5:
    print("Conceito C")
elif nota >= 7:
    print("Conceito B")
elif nota >= 9:
    print("Conceito A")
else:
    print("Conceito D")
nota = float(input("Nota da prova: "))
if nota >= 9:
    print("Conceito A")
elif nota >= 7:
    print("Conceito B")
elif nota >= 5:
    print("Conceito C")
else:
    print("Conceito D")

3. elif × vários if

E se a Ana trocasse cada elif por um if?

nota = 9.5
if nota >= 9:
    print("Conceito A")
if nota >= 7:
    print("Conceito B")
if nota >= 5:
    print("Conceito C")
$ python3 varios_ifs.py
Conceito A
Conceito B
Conceito C                         « três conceitos para a mesma prova

Vários if são perguntas independentes (aula if): todas são feitas, e cada uma que der "sim" roda o seu bloco. Já os degraus de uma escada elif são ligados: o primeiro "sim" encerra a escada.

if … elif … elifif … if … if
Quantas condições são testadas?Até a primeira verdadeiraTodas, sempre
Quantos blocos podem rodar?No máximo umZero, um, vários ou todos
Use quando…as opções se excluem: uma prova tem um conceitoas perguntas são assuntos diferentes: "pode votar?" e "precisa de óculos?"

4. Faixas de valor: o frete

A loja da Ana mudou o frete: compras a partir de R$ 100 têm frete grátis; a partir de R$ 50, o frete é R$ 10,00; abaixo disso, R$ 20,00.

total = float(input("Total da compra: R$ "))
if total >= 100:
    frete = 0.0
elif total >= 50:
    frete = 10.0
else:
    frete = 20.0
print(f"Frete: R$ {frete:.2f}")
print(f"Total a pagar: R$ {total + frete:.2f}")
$ python3 frete.py
Total da compra: R$ 120
Frete: R$ 0.00
Total a pagar: R$ 120.00
$ python3 frete.py
Total da compra: R$ 60
Frete: R$ 10.00
Total a pagar: R$ 70.00
$ python3 frete.py
Total da compra: R$ 30
Frete: R$ 20.00
Total a pagar: R$ 50.00

Os três caminhos dão valor à mesma variável, frete, e o programa continua depois da escada com o valor escolhido. Como há um else no fim, frete sempre recebe algum valor.


5. Sem else: pode não rodar nada

O else é opcional. Sem ele, se nenhuma condição der True, nenhum bloco roda e o programa simplesmente segue:

cor = input("Cor do semáforo: ")
if cor == "verde":
    print("Pode seguir.")
elif cor == "amarelo":
    print("Atenção: vai fechar.")
elif cor == "vermelho":
    print("Pare!")
print("--")
$ python3 semaforo.py
Cor do semáforo: amarelo
Atenção: vai fechar.
--
$ python3 semaforo.py
Cor do semáforo: azul
--                                 « nenhuma cor bateu, e não há else

Aqui, comparando textos com ==, a ordem não importa: uma cor não pode ser "verde" e "amarelo" ao mesmo tempo, então só uma condição pode dar True. A ordem só importa quando mais de uma condição pode ser verdadeira para o mesmo valor, como nas faixas de nota. Seria bom um else avisando "Cor desconhecida", não seria? Esse é o assunto da missão final. (Para comparar um valor com uma lista de opções fixas, como estas cores, o Python também tem o match e case.)

Missão: o semáforo da Ana ainda não conhece o vermelho. Acrescente um elif para "vermelho" que mostre Pare!. A entrada preparada é vermelho.

cor = input("Cor do semáforo: ")
if cor == "verde":
    print("Pode seguir.")
elif cor == "amarelo":
    print("Atenção: vai fechar.")
print("--")
cor = input("Cor do semáforo: ")
if cor == "verde":
    print("Pode seguir.")
elif cor == "amarelo":
    print("Atenção: vai fechar.")
elif cor == "vermelho":
    print("Pare!")
print("--")

Formas diferentes de escrever a mesma escada

As três escadas abaixo dão o mesmo conceito para qualquer nota (no lab, conferimos com 9.5, 7, 5.5 e 3: A, B, C e D nas três).

if nota >= 9:
    conceito = "A"
elif nota >= 7:
    conceito = "B"
elif nota >= 5:
    conceito = "C"
else:
    conceito = "D"
if nota < 5:
    conceito = "D"
elif nota < 7:
    conceito = "C"
elif nota < 9:
    conceito = "B"
else:
    conceito = "A"
if 7 <= nota < 9:
    conceito = "B"
elif nota >= 9:
    conceito = "A"
elif nota < 5:
    conceito = "D"
elif 5 <= nota < 7:
    conceito = "C"
FormaQuando usar
Descendo com >= (do maior para o menor)A mais comum. Cada degrau só precisa do limite de baixo, porque os de cima já foram descartados
Subindo com < (do menor para o maior)Igualmente certa; escolha a que fica mais natural de ler para o problema
Faixas completas (7 <= nota < 9)Funciona em qualquer ordem, porque cada faixa diz o começo e o fim. Em troca, é mais longa, cada limite aparece duas vezes (mais chance de errar um), e sem else a variável pode ficar sem valor se você esquecer uma faixa

Quando dá errado

else if, separado

Quem vem de linguagens como C, Java ou JavaScript escreve else if, em duas palavras. No Python, isso não existe:

nota = 6
if nota >= 7:
    print("Aprovada")
else if nota >= 5:
    print("Recuperação")
else:
    print("Reprovada")
$ python3 else_if.py
  File "/home/ana/else_if.py", line 4
    else if nota >= 5:
         ^^
SyntaxError: expected ':'

"Era esperado um :", com a marca embaixo do if. O Python leu o else e esperava os dois-pontos logo depois (o else nunca tem condição); em vez disso, encontrou outro if. A mensagem não fala em elif, então é bom reconhecer o padrão: expected ':' logo depois de um else quase sempre é um else if ou um else com condição. Como consertar: junte e encurte: elif nota >= 5:.

elseif ou outra grafia
nota = 6
if nota >= 7:
    print("Aprovada")
elseif nota >= 5:
    print("Recuperação")
$ python3 elseif.py
  File "/home/ana/elseif.py", line 4
    elseif nota >= 5:
    ^^^^^^
SyntaxError: invalid syntax. Did you mean 'elif'?

Aqui o Python 3.14 reconhece a palavra parecida e sugere: "Você quis dizer 'elif'?". O nome certo tem 4 letras: e-l-i-f.

elif depois do else
nota = 6
if nota >= 7:
    print("Aprovada")
else:
    print("Reprovada")
elif nota >= 5:
    print("Recuperação")
$ python3 elif_depois_else.py
  File "/home/ana/elif_depois_else.py", line 6
    elif nota >= 5:
    ^^^^
SyntaxError: 'elif' block follows an 'else' block

"Um bloco elif vem depois de um bloco else". O else pega "todo o resto", então depois dele não sobra nada para um elif testar. Como consertar: o else é sempre o último degrau; mova o elif para cima dele.

elif sem if
nota = 6
elif nota >= 5:
    print("Recuperação")
$ python3 elif_sozinho.py
  File "/home/ana/elif_sozinho.py", line 2
    elif nota >= 5:
    ^^^^
SyntaxError: invalid syntax

Como o else, o elif ("senão, se") precisa de um if antes dele, na mesma coluna e logo depois do bloco. Toda escada começa com if.

elif sem condição
nota = 6
if nota >= 7:
    print("Aprovada")
elif:
    print("Reprovada")
$ python3 elif_sem_condicao.py
  File "/home/ana/elif_sem_condicao.py", line 4
    elif:
        ^
SyntaxError: invalid syntax

O elif sempre tem uma condição. Para "todo o resto", sem pergunta, o certo é o else:.

Sem mensagem nenhuma: a ordem errada

O erro mais perigoso do elif não tem traceback: é a escada na ordem errada da seção 2, que roda sem reclamar e dá a resposta errada. Para se proteger, teste o programa com um valor de cada faixa e com os limites (no conceito: 9, 8.9, 7, 6.9, 5, 4.9).

E o else: com um if dentro?

Isto funciona e dá o mesmo resultado que um elif:

nota = 6
if nota >= 7:
    print("Aprovada")
else:
    if nota >= 5:
        print("Recuperação")
    else:
        print("Reprovada")
$ python3 aninhado_ok.py
Recuperação

É um if dentro do bloco do else: uma condição aninhada, o assunto da próxima aula (Condições Aninhadas). Cada degrau empurra o código mais para a direita; com elif, a escada fica toda na mesma coluna e mais fácil de ler.


Referência rápida

EscritaO que faz
if c1: … elif c2: … else:Testa c1, depois c2…, e roda o bloco da primeira verdadeira; se nenhuma for, roda o else
Vários elifQuantos degraus forem precisos
Sem elseSe nenhuma condição for verdadeira, nenhum bloco roda
Ordem com >=Do limite maior para o menor
Ordem com <Do limite menor para o maior
MensagemCausa provável
SyntaxError: expected ':', marcando o if depois do elseEscreveu else if: no Python é elif
SyntaxError: invalid syntax. Did you mean 'elif'?Escreveu elseif (ou outra grafia parecida)
SyntaxError: 'elif' block follows an 'else' blockelif depois do else: o else tem de ser o último
SyntaxError: invalid syntax, marcando o elifelif sem if antes, ou elif sem condição
Resposta errada, sem erroCondições na ordem errada: uma de cima "engole" as de baixo

Exercícios

1. Complete a escada

Complete a palavra que faltou no meio da escada:

if temperatura > 30:
    print("Calor")
temperatura > 20:
    print("Agradável")
else:
    print("Frio")

2. Qual sai?

Na escada do exercício 1, o que aparece quando temperatura = 25?

Resposta:

3. O que este programa mostra?

idade = 70
if idade >= 18:
    print("Adulto")
elif idade >= 60:
    print("Idoso")
else:
    print("Criança")

4. No exercício 3, como fazer 70 anos mostrar Idoso?

5. Numa escada if/elif/elif sem else, quantos blocos podem rodar?

6. O Python mostrou SyntaxError: 'elif' block follows an 'else' block. O que fazer?

Missão final: três preços no cinema

Missão: o cinema agora tem três preços: criança (menos de 12 anos) paga R$ 10.00, idoso (60 anos ou mais) paga R$ 15.00 e os outros pagam R$ 30.00. O programa só conhece idoso e adulto. Acrescente um elif para as crianças, mostrando Criança: R$ 10.00. A entrada preparada é 8.

idade = int(input("Idade: "))
if idade >= 60:
    print("Idoso: R$ 15.00")
else:
    print("Adulto: R$ 30.00")
idade = int(input("Idade: "))
if idade >= 60:
    print("Idoso: R$ 15.00")
elif idade < 12:
    print("Criança: R$ 10.00")
else:
    print("Adulto: R$ 30.00")

Aqui a ordem dos dois primeiros degraus não importa: ninguém tem ao mesmo tempo menos de 12 e 60 anos ou mais. No lab, a solução mostrou Criança: R$ 10.00 para 8, Adulto: R$ 30.00 para 30 e Idoso: R$ 15.00 para 70.


Resumo

  • elif ("senão, se") acrescenta degraus a um if: if → elif → elif → … → else, todos na mesma coluna.
  • O Python testa de cima para baixo e roda só o bloco da primeira condição verdadeira; o resto da escada é pulado.
  • A ordem importa quando mais de uma condição pode ser verdadeira: com >=, comece pelo limite maior. A ordem errada não dá erro, dá a resposta errada.
  • O else do fim é opcional; sem ele, pode não rodar bloco nenhum.
  • Vários if são perguntas independentes (vários blocos podem rodar); elif são opções que se excluem (no máximo um).
  • No Python não existe else if nem elseif: é elif. E nada de elif depois do else.