Python if em uma Linha
Muitas vezes, o if/else serve só para escolher um valor: "Aprovada" ou "Reprovada", frete 0 ou 15, "ano" ou "anos". Escrever quatro linhas para isso parece demais. O Python tem um jeito de fazer essa escolha numa linha só: a expressão condicional, que muita gente chama de "if ternário" (ternário porque tem três partes). Nesta aula você aprende a usá-la, quando ela deixa o código mais claro e quando é melhor voltar ao if de várias linhas.
- A escrever
valor_se_sim if condição else valor_se_não, e a ler essa frase em português. - A usar a escolha numa variável, dentro de um
printe dentro de uma f-string. - A diferença entre o
ifque faz coisas (o comando) e oifque vale alguma coisa (a expressão). - Por que o
elseé obrigatório, e por que encadear vários é má ideia. - O outro "if em uma linha": o bloco na mesma linha dos dois-pontos.
- Os erros reais:
expected 'else' after 'if' expression, o? :de outras linguagens, dois-pontos e=no meio da expressã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: uma frase só
A Ana pergunta para a amiga o que levar no passeio, e a resposta vem numa frase: "guarda-chuva se estiver chovendo, senão óculos escuros". A frase inteira é a resposta: ela vale "guarda-chuva" ou "óculos escuros", dependendo do tempo.
A expressão condicional do Python é escrita nessa mesma ordem:
"guarda-chuva" if chovendo else "óculos escuros"
Leia em voz alta: "guarda-chuva se chovendo, senão óculos escuros". O resultado é um valor, que você pode guardar numa variável, mostrar ou usar numa conta.
1. A primeira expressão condicional
Na aula if e else, a situação da aluna era escolhida assim:
nota = float(input("Nota da prova: "))
if nota >= 7:
situacao = "Aprovada"
else:
situacao = "Reprovada"
print("Situação:", situacao)
Os dois blocos só dão um valor à mesma variável. Com a expressão condicional, as quatro linhas viram uma:
nota = float(input("Nota da prova: "))
situacao = "Aprovada" if nota >= 7 else "Reprovada"
print("Situação:", situacao)
$ python3 situacao.py Nota da prova: 8 Situação: Aprovada $ python3 situacao.py Nota da prova: 4.5 Situação: Reprovada
A versão longa, com 8, também mostrou Situação: Aprovada: as duas fazem exatamente a mesma coisa.
- situacao =
- Uma atribuição comum: guarda o valor da direita na variável.
- "Aprovada"
- O valor se a condição for verdadeira. Vem primeiro, antes do
if. - if nota >= 7
- A condição, no meio. Sem dois-pontos: aqui o
ifnão abre bloco nenhum. - else "Reprovada"
- O valor se a condição for falsa. O
elseé obrigatório: a expressão tem de valer alguma coisa nos dois casos.
O if das aulas anteriores é um comando: ele faz coisas (roda um bloco ou não). A expressão condicional vale uma coisa, como 2 + 3 vale 5. Por isso ela pode aparecer em qualquer lugar onde caberia um valor: à direita do =, dentro do print(), numa conta, numa f-string.
2. Números também: o frete
total = float(input("Total da compra: R$ "))
frete = 0.0 if total >= 100 else 15.0
print(f"Frete: R$ {frete:.2f}")
print(f"Total a pagar: R$ {total + frete:.2f}")
$ python3 frete.py Total da compra: R$ 150 Frete: R$ 0.00 Total a pagar: R$ 150.00 $ python3 frete.py Total da compra: R$ 60 Frete: R$ 15.00 Total a pagar: R$ 75.00
Os dois valores podem ser de qualquer tipo: textos, números, True/False, None. O costume é que sejam do mesmo tipo (aqui, dois float), para que o resto do programa saiba o que esperar.
Experimente: rode e digite valores acima e abaixo de 100 no terminal da caixa (e exatamente 100). Depois mude a regra: frete de R$ 9.90 para compras abaixo de R$ 50 e grátis a partir disso. Só a linha do meio precisa mudar.
total = float(input("Total da compra: R$ "))
frete = 0.0 if total >= 100 else 15.0
print(f"Frete: R$ {frete:.2f}")
print(f"Total a pagar: R$ {total + frete:.2f}")
3. Singular ou plural
Um uso clássico: escolher entre "ano" e "anos", "mensagem" e "mensagens". Sem isso, o programa escreve coisas como "1 anos".
idade = int(input("Sua idade: "))
falta = 18 - idade
palavra = "ano" if falta == 1 else "anos"
print(f"Tempo até a carteira de motorista: {falta} {palavra}.")
$ python3 anos.py Sua idade: 17 Tempo até a carteira de motorista: 1 ano. $ python3 anos.py Sua idade: 15 Tempo até a carteira de motorista: 3 anos.
Direto na f-string
Como a expressão vale um texto, ela pode ir dentro das chaves da f-string, sem a variável palavra:
falta = 1
print(f"Tempo até a carteira de motorista: {falta} {'ano' if falta == 1 else 'anos'}.")
$ python3 anos2.py Tempo até a carteira de motorista: 1 ano.
Repare nas aspas simples em 'ano' e 'anos': a f-string já usa aspas duplas por fora, e as simples por dentro deixam claro onde cada texto começa e termina. A linha ficou bem comprida, porém; quando isso acontecer, a versão com a variável palavra é mais fácil de ler.
Missão: o celular da Ana diz Você tem 1 mensagens novas., o que está errado. Use uma expressão condicional (numa linha só) para escolher entre "mensagem nova" e "mensagens novas". A entrada preparada é 1; a saída tem de ser Você tem 1 mensagem nova.
quantidade = int(input("Quantas mensagens? "))
texto = "mensagens novas"
print(f"Você tem {quantidade} {texto}.")
quantidade = int(input("Quantas mensagens? "))
texto = "mensagem nova" if quantidade == 1 else "mensagens novas"
print(f"Você tem {quantidade} {texto}.")
4. Dentro do print
chovendo = True
print("Leve o guarda-chuva." if chovendo else "Pode ir de óculos escuros.")
resultado = print("oi") if chovendo else print("tchau")
print(resultado)
$ python3 print_ternario.py
Leve o guarda-chuva.
oi
None « o print("oi") devolveu None
A linha 2 é o uso certo: a expressão escolhe qual texto o print vai mostrar. A linha 3 também funciona, mas é um mau hábito: ela usa a expressão para escolher qual ação fazer, e o valor que sobra (None, o que o print devolve; aula O Valor None) não serve para nada. Quando o que muda é a ação, use o if/else normal.
5. Encadear: dá, mas evite
O valor do else pode ser outra expressão condicional, e assim por diante:
nota = 7.5
conceito = "A" if nota >= 9 else "B" if nota >= 7 else "C" if nota >= 5 else "D"
print("Conceito:", conceito)
$ python3 encadeado.py Conceito: B
Funciona, e é testado na mesma ordem de uma escada elif: da esquerda para a direita, parando na primeira condição verdadeira. Mas é difícil de ler, de conferir e de mudar. Com mais de duas opções, prefira a escada if/elif/else.
6. O outro "if em uma linha": o bloco na mesma linha
Existe mais uma coisa que às vezes é chamada de "if em uma linha": escrever o bloco logo depois dos dois-pontos, na mesma linha. Isso é o if comando de sempre, só que espremido:
estoque = 2
if estoque < 5: print("Estoque baixo!")
if estoque == 0: print("Esgotado!")
else: print("Ainda tem", estoque)
$ python3 uma_linha.py Estoque baixo! Ainda tem 2
O Python aceita, quando o bloco tem uma instrução só. Mas o guia de estilo oficial (PEP 8) recomenda não fazer isso: fica mais difícil de ver onde está a condição e onde está a ação, e para acrescentar uma segunda linha ao bloco você vai ter de reescrever tudo. No guia, usamos sempre o bloco recuado embaixo.
Formas diferentes de escolher um valor
| Forma | Exemplo | Quando usar |
|---|---|---|
| Expressão condicional | frete = 0.0 if total >= 100 else 15.0 | Escolher entre dois valores curtos. É o caso perfeito |
if/else de várias linhas | if total >= 100:frete = 0.0else:frete = 15.0 | Quando os caminhos fazem mais de uma coisa, ou quando a condição é longa |
Escada elif | if … elif … else | Mais de duas opções |
| Uma função pronta | maior = max(a, b) | Quando já existe uma função para isso. a if a > b else b e max(a, b) deram os dois 30 no lab, com a = 12 e b = 30 (aula Funções Embutidas) |
Em C, Java e JavaScript, o "ternário" se escreve condição ? valor_se_sim : valor_se_não, com a condição na frente. No Python, a ordem é outra (o valor "normal" primeiro, a condição no meio) e as palavras são if e else. O ? : não existe no Python, como você vai ver logo abaixo.
Quando dá errado
else
nota = 9.5 conceito = "A" if nota >= 9 print(conceito)
$ python3 sem_else.py
File "/home/ana/sem_else.py", line 2
conceito = "A" if nota >= 9
^^^^^^^^^^^^^^^^
SyntaxError: expected 'else' after 'if' expression
"Era esperado um else depois da expressão if". Os ^^^^ sublinham a expressão inteira. Se a nota fosse 8, que valor conceito receberia? O Python não aceita uma expressão que pode ficar sem valor. Como consertar: acrescente o else com o valor do outro caso (else "B", ou else None se não houver valor).
? : de outras linguagens
nota = 8 situacao = nota >= 7 ? "Aprovada" : "Reprovada" print(situacao)
$ python3 interrogacao.py
File "/home/ana/interrogacao.py", line 2
situacao = nota >= 7 ? "Aprovada" : "Reprovada"
^
SyntaxError: invalid syntax
A setinha aponta o ?, que não tem significado nenhum no Python. Como consertar: situacao = "Aprovada" if nota >= 7 else "Reprovada".
nota = 8 situacao = "Aprovada" if nota >= 7: else "Reprovada" print(situacao)
$ python3 dois_pontos.py
File "/home/ana/dois_pontos.py", line 2
situacao = "Aprovada" if nota >= 7: else "Reprovada"
^
SyntaxError: invalid syntax
Costume do if de várias linhas. Na expressão condicional não há bloco, então não há dois-pontos. Como consertar: apague o :.
if
nota = 8 situacao = if nota >= 7 "Aprovada" else "Reprovada" print(situacao)
$ python3 ordem.py
File "/home/ana/ordem.py", line 2
situacao = if nota >= 7 "Aprovada" else "Reprovada"
^^
SyntaxError: invalid syntax
Depois do =, o Python espera um valor, e um if não pode começar um valor. Na expressão condicional, o primeiro valor vem antes do if. Como consertar: "Aprovada" if nota >= 7 else "Reprovada".
else
nota = 8 situacao = "Aprovada" if nota >= 7 else situacao = "Reprovada" print(situacao)
$ python3 atribuicao.py
File "/home/ana/atribuicao.py", line 2
situacao = "Aprovada" if nota >= 7 else situacao = "Reprovada"
^^^^^^^^^^^^^^^^^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
Os dois lados da expressão são valores, e situacao = "Reprovada" é um comando, não um valor. A dica do Python ("você quis dizer ==?") aqui não ajuda: o problema é a ideia. Como consertar: o situacao = aparece uma vez só, no começo: situacao = "Aprovada" if nota >= 7 else "Reprovada".
Referência rápida
| Escrita | O que vale / faz |
|---|---|
A if condição else B | Vale A se a condição for verdadeira; senão, B |
x = A if c else B | Guarda a escolha numa variável |
print(A if c else B) | Mostra a escolha |
f"{'A' if c else 'B'}" | Escolha dentro de uma f-string (aspas simples por dentro) |
A if c1 else B if c2 else C | Encadeado: funciona, mas prefira elif |
if c: comando | O if comando com o bloco na mesma linha: aceito, mas fora do estilo recomendado |
| Mensagem | Causa provável |
|---|---|
SyntaxError: expected 'else' after 'if' expression | Faltou o else e o valor do outro caso |
SyntaxError: invalid syntax, apontando o ? | Usou o ? : de outra linguagem |
SyntaxError: invalid syntax, apontando o : | Dois-pontos depois da condição |
SyntaxError: invalid syntax, apontando o if | Começou pelo if: o primeiro valor vem antes |
Maybe you meant '==' or ':=' instead of '='? numa expressão com else | Uma atribuição dentro da expressão |
Exercícios
1. Complete as palavras
A variável tipo deve valer "maior" para 18 anos ou mais e "menor" para o resto:
2. Qual o valor?
Com estoque = 0, quanto vale "tem" if estoque > 0 else "esgotado"? Escreva sem aspas.
3. Qual linha está certa em Python?
4. Por que x = "A" if nota >= 9 dá SyntaxError?
5. Em qual caso o if/else de várias linhas é melhor que a expressão condicional?
Missão final: par ou ímpar em uma linha
Missão: reescreva as quatro linhas do if/else como uma expressão condicional que dá valor à variável tipo ("par" ou "ímpar"). A entrada preparada é 7, e a saída tem de continuar sendo 7 é ímpar.
numero = int(input("Número: "))
if numero % 2 == 0:
tipo = "par"
else:
tipo = "ímpar"
print(f"{numero} é {tipo}.")
numero = int(input("Número: "))
tipo = "par" if numero % 2 == 0 else "ímpar"
print(f"{numero} é {tipo}.")
Resumo
- A expressão condicional escolhe um valor numa linha:
valor_se_sim if condição else valor_se_não. Leia: "isto se condição, senão aquilo". - Ela vale alguma coisa, então pode ir à direita do
=, dentro doprint(), numa conta ou numa f-string. - Sem dois-pontos, e com
elseobrigatório (senão:expected 'else' after 'if' expression). - A ordem é diferente do
? :de outras linguagens, que não existe no Python. - Use para escolher entre dois valores curtos. Para ações, várias linhas ou mais de duas opções, volte ao
if/elif/else. if c: comandonuma linha só também existe, mas o estilo recomendado é o bloco recuado embaixo.