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.
- 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
elsedo fim é opcional, e o que acontece sem ele. - A diferença entre
elife váriosifseguidos. - Os erros reais do Python 3.14:
else if,elseif,elifdepois doelse,elifsemifeelifsem 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":
- A nota é 9 ou mais? Se sim, conceito A, e acabou: ela pega a próxima prova.
- Se não: a nota é 7 ou mais? Se sim, conceito B, e acabou.
- Se não: a nota é 5 ou mais? Se sim, conceito C, e acabou.
- 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 oif. - elif nota >= 5:
- Mais um degrau. Você pode pôr quantos
elifquiser. - else:
- "Senão": roda quando nenhuma condição acima deu
True. É opcional e, se existir, é sempre o último. - a mesma coluna
if, oselife oelseficam todos alinhados na mesma coluna. Cada um tem o seu bloco recuado embaixo.
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.
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 … elif | if … if … if | |
|---|---|---|
| Quantas condições são testadas? | Até a primeira verdadeira | Todas, sempre |
| Quantos blocos podem rodar? | No máximo um | Zero, um, vários ou todos |
| Use quando… | as opções se excluem: uma prova tem um conceito | as 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"
| Forma | Quando 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:.
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).
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
| Escrita | O 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 elif | Quantos degraus forem precisos |
Sem else | Se nenhuma condição for verdadeira, nenhum bloco roda |
Ordem com >= | Do limite maior para o menor |
Ordem com < | Do limite menor para o maior |
| Mensagem | Causa provável |
|---|---|
SyntaxError: expected ':', marcando o if depois do else | Escreveu else if: no Python é elif |
SyntaxError: invalid syntax. Did you mean 'elif'? | Escreveu elseif (ou outra grafia parecida) |
SyntaxError: 'elif' block follows an 'else' block | elif depois do else: o else tem de ser o último |
SyntaxError: invalid syntax, marcando o elif | elif sem if antes, ou elif sem condição |
| Resposta errada, sem erro | Condiçõ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:
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?
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 umif: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
elsedo fim é opcional; sem ele, pode não rodar bloco nenhum. - Vários
ifsão perguntas independentes (vários blocos podem rodar);elifsão opções que se excluem (no máximo um). - No Python não existe
else ifnemelseif: éelif. E nada deelifdepois doelse.