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.

Você vai aprender
  • 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 print e dentro de uma f-string.
  • A diferença entre o if que faz coisas (o comando) e o if que 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 if nã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.
Comando × expressão

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

FormaExemploQuando usar
Expressão condicionalfrete = 0.0 if total >= 100 else 15.0Escolher entre dois valores curtos. É o caso perfeito
if/else de várias linhasif total >= 100:
    frete = 0.0
else:
    frete = 15.0
Quando os caminhos fazem mais de uma coisa, ou quando a condição é longa
Escada elifif … elif … elseMais de duas opções
Uma função prontamaior = 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)
Vindo de outra linguagem?

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

Esqueceu o 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).

O ? : 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".

Dois-pontos no meio
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 :.

Começar pelo 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".

Uma atribuição dentro do 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

EscritaO que vale / faz
A if condição else BVale A se a condição for verdadeira; senão, B
x = A if c else BGuarda 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 CEncadeado: funciona, mas prefira elif
if c: comandoO if comando com o bloco na mesma linha: aceito, mas fora do estilo recomendado
MensagemCausa provável
SyntaxError: expected 'else' after 'if' expressionFaltou 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 ifComeçou pelo if: o primeiro valor vem antes
Maybe you meant '==' or ':=' instead of '='? numa expressão com elseUma 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:

tipo = "maior" idade >= 18 "menor"

2. Qual o valor?

Com estoque = 0, quanto vale "tem" if estoque > 0 else "esgotado"? Escreva sem aspas.

Resposta:

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 do print(), numa conta ou numa f-string.
  • Sem dois-pontos, e com else obrigató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: comando numa linha só também existe, mas o estilo recomendado é o bloco recuado embaixo.