Escrever se declarações numa linha com o operador ternário de Python (operador condicional)

O negócio

Python tem um estilo de escrita chamado operadores ternários (operadores condicionais) que pode descrever um processo como uma declaração de se numa única linha.

O seguinte é explicado aqui, juntamente com o código da amostra.

  • Escrita básica de operadores ternários
  • if ... elif ... else ...Descreva-o numa linha
  • Lista Combinando Notação Abrangente e Operadores Ternários
  • Combinação de funções anónimas (expressões lambda) e operadores ternários

Ver o artigo seguinte para mais informações sobre o normal se declaração.

Escrita básica de operadores ternários

Em Python, o operador ternário pode ser escrito da seguinte forma

Expression evaluated when the conditional expression is true if conditional expression else Expression evaluated when the conditional expression is false

Se quiser mudar os valores de acordo com as condições, basta escrever cada valor tal como está.

Value to return if conditional expression is true if conditional expression else Value to return if conditional expression is false
a = 1
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# odd

a = 2
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# even

Se quiser mudar o processamento de acordo com as condições, descreva cada expressão.

a = 1
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 3

a = 2
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 4

Expressões que não devolvem um valor (expressões que não devolvem nenhum) também são aceitáveis. Consoante a condição, uma das expressões é avaliada e o processo é executado.

a = 1
print('even') if a % 2 == 0 else print('odd')
# odd

Equivalente ao seguinte código escrito com uma declaração normal se.

a = 1

if a % 2 == 0:
    print('even')
else:
    print('odd')
# odd

As múltiplas expressões condicionais também podem ser concatenadas utilizando operadores lógicos (e, ou, etc.).

a = -2
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# negative and even

a = -1
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# positive or odd

if ... elif ... else ...Descrição de uma linha

if ... elif ... else ...Não há nenhuma maneira especial de escrever isto numa única linha. No entanto, pode ser realizada utilizando outro operador ternário na expressão que é avaliada quando a expressão condicional do operador ternário é falsa. Imagem dos operadores ternários de nidificação.

No entanto, pode ser melhor não o utilizar extensivamente porque reduz a legibilidade.

a = 2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# positive

a = 0
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# zero

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

A seguinte expressão condicional pode ser interpretada das duas formas seguintes, mas é tratada como a primeira (1).

A if condition 1 else B if condition 2 else C
1. A if condition 1 else ( B if condition 2 else C )
2. ( A if condition 1 else B ) if condition 2 else C 

Um exemplo concreto é o seguinte. A primeira expressão é considerada como se fosse a segunda.

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

result = 'negative' if a < 0 else ('positive' if a > 0 else 'zero')
print(result)
# negative

result = ('negative' if a < 0 else 'positive') if a > 0 else 'zero'
print(result)
# zero

Lista Combinando Notação Abrangente e Operadores Ternários

Uma utilização útil do operador ternário é quando se processam listas em notação de compreensão de listas.

Ao combinar a notação de operador ternário e de compreensão de lista, é possível substituir elementos de uma lista ou realizar algum outro processamento, dependendo das condições.

l = ['even' if i % 2 == 0 else i for i in range(10)]
print(l)
# ['even', 1, 'even', 3, 'even', 5, 'even', 7, 'even', 9]
l = [i * 10 if i % 2 == 0 else i for i in range(10)]
print(l)
# [0, 1, 20, 3, 40, 5, 60, 7, 80, 9]

Para mais informações sobre a notação de compreensão da lista, ver o artigo seguinte.

Combinação de funções anónimas (expressões lambda) e operadores ternários

O operador ternário, que pode ser descrito de forma concisa mesmo numa função anónima (expressão lambda), é útil.

get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Note-se que, embora não relacionado com o operador ternário, o exemplo acima atribui um nome à expressão lambda. Por conseguinte, ferramentas de verificação automática como a convenção de codificação Python PEP8 podem gerar um Aviso.

Isto porque PEP8 recomenda o uso de def quando se atribuem nomes a funções.

O conceito de PEP8 é o seguinte

  • As expressões Lambda são utilizadas para passar objectos chamaveis como argumentos, por exemplo, sem os nomear
  • Nas expressões lambda, use def para definir pelo nome
Copied title and URL