Como usar o operador ternário do Python

Este guia ensinará como usar o operador ternário em Python. Você aprenderá a sintaxe e vários exemplos de código para entender como funciona.

Começaremos revisando como a instrução condicional if-else funciona e aprenderemos como escrever uma expressão equivalente usando o operador ternário.

A seguir, codificaremos alguns exemplos e aprenderemos como emular o comportamento do operador ternário do Python usando uma tupla e um dicionário do Python. Por fim, revisaremos alguns casos de uso em que você deve preferir usar o operador ternário.

Vamos começar!

A instrução If-Else em Python: uma revisão

Você pode codificar iniciando um Python REPL ou no editor Python on-line do etechpt.com.

A sintaxe genérica da instrução if-else em Python é a seguinte:

if condition:
    # do this
else:
    # do this

No trecho acima, condição denota a condição a ser verificada. Se a condição for avaliada como True, o bloco if é acionado. Se a condição for avaliada como False, as instruções dentro do bloco else serão executadas.

Aqui está um exemplo em que a variável game_over recebe um valor booleano, dependendo se o valor de energy é menor ou igual a zero.

  • Se energy <= 0, game_over é True.
  • Caso contrário, game_over é falso.

O trecho de código a seguir mostra como fazer isso usando as instruções condicionais if-else:

energy = -1

if energy <= 0:
    game_over = True
else:
    game_over = False

print(game_over)
# True

Neste exemplo, a energia é -1, que é menor que 0. Portanto, game_over é verdadeiro.

Operador ternário do Python: sintaxe e exemplos

Python tem um operador ternário que funciona muito como o operador condicional ternário em linguagens como C e C++. A sintaxe geral para usá-lo é a seguinte:

expression1 if condition else expression2

Vamos analisar a sintaxe acima:

  • condição: A condição a ser verificada.
  • expression1: A expressão para avaliar se a condição é True.
  • expression2: A expressão para avaliar se a condição é False.

Agora, identificaremos qual expressão1, expressão2 e condição devem ser da versão if-else do código.

  10 melhores softwares de roadmap de produtos para um progresso simplificado

Juntando tudo, temos o seguinte usando o operador ternário do Python.

game_over = True if energy <= 0 else False
print(game_over)
# True

Vamos codificar outro exemplo. Suponha que você administre uma livraria e dê aos leitores um desconto em suas compras, dependendo da frequência com que eles visitaram sua loja no último ano.

Deixe numVisits denotar o número de visitas.

  • Se numVisits > 7, a porcentagem de desconto, discount_perc é 20.
  • Caso contrário, discount_perc é 5.

Usamos o operador ternário para atribuir valor à variável discount_perc.

numVisits = 10

discount_perc = 20 if numVisits > 7 else 5

print(discount_perc)
# 20 (as numVisits = 10 which is > 7)

A seguir, aprenderemos como emular o operador ternário usando uma tupla do Python e um dicionário.

Emulando o operador ternário com Python Tuple

Como todos os iteráveis ​​em Python, as tuplas seguem a indexação zero. Portanto, se você tiver dois elementos em uma tupla, tuple_name[0] denota o primeiro elemento na tupla e tuple_name[1] dá o segundo elemento na tupla.

Os tipos básicos de dados em Python são integer, float, string e boolean. O Python oferece suporte à conversão de tipos que permite representar um tipo de dados específico por sua representação equivalente em outro tipo de dados.

Inicie um Python REPL e execute os exemplos a seguir. Se você tentar converter números inteiros em booleanos, notará o seguinte:

  • bool(0) é Falso.
  • bool() retorna True.
>>> bool(0)
False
>>> bool(1)
True
>>> bool(-1)
True
>>> bool(10)
True

Da mesma forma, ao converter Boolean para inteiros, temos o seguinte:

>>> int(True)
1
>>> int(False)
0

Juntando a conversão de tipos e a indexação, podemos fazer o seguinte:

  • Elemento no índice 0 na tupla: O valor a ser usado quando a condição for False.
  • Elemento no índice 1 da tupla: O valor a ser usado quando a condição for True.

Uisng o acima, temos o seguinte:

>>> numVisits = 10
>>> discount_perc = (5,20)[numVisits > 7]
>>> discount_perc
# 20

Aqui, a condição numVisits > 7 é True, pois numVisits é 10. Como int(True) é 1, o valor de discount_perc é 20, o elemento no índice 1.

Emulando o operador ternário com o dicionário Python

Você pode definir True e False como as chaves do dicionário. E você pode definir expression1 e expression2 como os valores correspondentes às chaves True e False, respectivamente.

some_dict = {True: expression1,
             False: expression2
            }

O que você faz em seguida? Agora, se você usar some_dict[condition], a expressão1 correspondente à chave True será avaliada se a condição for True. E a expressão2 é avaliada quando a condição é False.

Vamos codificar o exemplo discount_perc (novamente), mas desta vez usando um dicionário Python.

>>> numVisits = 10
>>> discount_dict = {True: 20, False:5}
>>> discount_perc = discount_dict[numVisits > 7]
>>> discount_perc
# 20

Aqui, numVisits = 10 que é maior que 7. Portanto, a condição numVisits > 7 é True. Então desconto_dict[numVisits > 7] avalia para discount_dict[True] que é o valor 20.

Você deve sempre usar o operador ternário do Python?

Até agora, aprendemos como usar o operador ternário. Mas devemos sempre usar o operador ternário? Bem, o operador ternário pode não ser a melhor escolha para todos os casos de uso. Esta seção detalha quando você deve preferir usar o operador ternário em vez de instruções if-else. Também abordaremos quando devemos considerar o uso da instrução if-else em vez do operador ternário.

Blocos mais concisos do que if-else

Conforme mencionado, em Python, a expressão do operador ternário é mais concisa do que a instrução if-else. Portanto, você pode usá-lo para verificar condições e avaliar expressões condicionalmente em tempo real.

No exemplo a seguir, nums é uma lista de 100 inteiros gerados aleatoriamente. Para cada um dos 100 números, verificamos se é par ou ímpar. E essa avaliação ocorre em linha dentro da f-string.

import random

nums = [random.choice(range(100)) for i in range(10)]

for num in nums:
    print(f"{num} is {'even' if num%2==0 else 'odd'}")
# sample output

0 is even
56 is even
6 is even
53 is odd
62 is even
7 is odd
8 is even
77 is odd
41 is odd
94 is even

O operador ternário requer a cláusula Else

Quando você estiver usando as instruções condicionais if-else, a cláusula else é opcional. Vamos dar um exemplo. A variável game_over é definida como True se a energia cair para um valor menor ou igual a zero.

Porém, se a energia for maior que zero, a variável game_over nunca é inicializada. Portanto, você encontrará erros se tentar acessar a variável game_over.

energy = 5
if energy <= 0:
    game_over = True

print(f"Is the game over? {game_over}")
Traceback (most recent call last):
  File "ternary_op.py", line 39, in <module>
    print(f"Is the game over? {game_over}")
NameError: name 'game_over' is not defined

Uma maneira de corrigir isso é definir game_over como False inicialmente e atualizá-lo para True se o nível de energia for menor ou igual a zero.

energy = 5
game_over = False
if energy <= 0:
    game_over1 = True

print(f"Is the game over? {game_over}")

No entanto, ao usar o operador ternário do Python equivalente ao acima, a cláusula else não é opcional. O operador ternário requer que a expressão seja avaliada quando a condição for False.

game_over = True if energy <= 0 else False

Se você alterar o acima para game_over = True if energy <= 0 removendo a outra parte, você encontrará um erro de sintaxe, conforme mostrado:

File "ternary_op.py", line 42
    game_over = True if energy <= 0
                                  ^
SyntaxError: invalid syntax

Para verificar várias condições, use instruções If-Else

Considere o exemplo: Cada pergunta em um conjunto de perguntas de entrevista de codificação tem uma pontuação de dificuldade associada. Dependendo dessa pontuação, atribuímos um dos três níveis de dificuldade: fácil, médio ou difícil a uma determinada questão. Suponha que temos o seguinte:

Pontuação Nível de dificuldade Menos de 10 fácil Entre 10 e 20 médio Maior que 20 difícil

Dada a pontuação de dificuldade, você pode obter seu nível de dificuldade usando o operador ternário do Python, conforme mostrado:

score = 12

difficulty_level = "easy" if score < 10 else "hard" if score > 20 else "medium"

print(difficulty_level)
# medium

A expressão do operador ternário no bloco de código acima tem o seguinte formato:

expression1 if condition1 else expression2 if condition2 else expression3

Embora conciso, é um pouco difícil de ler e analisar. A imagem a seguir mostra como ocorre o fluxo de controle neste caso.

O trecho de código a seguir mostra uma implementação equivalente usando instruções if-else. Como visto, o fluxo de controle é muito mais fácil de entender e o código é mais legível.

if score < 10:
    difficulty_level="easy"
elif score > 20:
    difficulty_level="hard"
else:
    difficulty_level="medium"

print(difficulty_level)

Portanto, quando você tiver várias condições, deverá usar os blocos if-else em vez do operador ternário. Isso garante que o código seja fácil de ler e entender.

Além disso, quando você precisa executar várias instruções — dependendo se a condição é verdadeira ou falsa — você deve considerar o uso da instrução if-else.

Conclusão

Aqui está uma recapitulação do que você aprendeu neste tutorial.

  • Em Python, o operador ternário pode ser usado com a seguinte sintaxe: expressão1 if condição else expressão2.
  • Você pode emular o comportamento do operador ternário usando tuplas e dicionários do Python.
  • Embora o operador ternário possa ser uma alternativa mais concisa aos blocos if-else, você deve garantir que o código seja legível. Para melhorar a legibilidade do código, você pode usar as instruções if-else em vez do operador ternário, especialmente quando precisar encadear várias condições.

A seguir, aprenda a conferir o tutorial sobre operadores iguais e diferentes em Python.