Escribir declaracións if nunha liña co operador ternario de Python (operador condicional)

Negocios

Python ten un estilo de escritura chamado operadores ternarios (operadores condicionais) que poden describir un proceso como unha instrución if nunha soa liña.

Aquí explícase o seguinte, xunto co código de mostra.

  • Redacción básica de operadores ternarios
  • if ... elif ... else ...Descríbeo nunha soa liña
  • Combinando a notación completa de lista e os operadores ternarios
  • Combinación de funcións anónimas (expresións lambda) e operadores ternarios

Consulte o seguinte artigo para obter máis información sobre a declaración if normal.

Redacción básica de operadores ternarios

En Python, o operador ternario pódese escribir do seguinte xeito

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

Se queres cambiar os valores segundo as condicións, simplemente escribe cada valor tal e 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 queres cambiar o procesamento segundo as condicións, describe cada expresión.

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

As expresións que non devolven un valor (expresións que devolven Ningún) tamén son aceptables. Segundo a condición, avalíase unha das expresións e execútase o proceso.

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

Equivale ao seguinte código escrito cunha instrución if normal.

a = 1

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

Tamén se poden concatenar varias expresións condicionais mediante operadores lóxicos (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 ...Descrición dunha liña

if ... elif ... else ...Non hai ningunha forma especial de escribir isto nunha soa liña. Non obstante, pódese realizar empregando outro operador ternario na expresión que se avalía cando a expresión condicional do operador ternario é falsa. Imaxe dos operadores ternarios aniñados.

Non obstante, pode ser mellor non usalo moito porque reduce a lexibilidade.

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 expresión condicional pódese interpretar das dúas formas seguintes, pero trátase 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 

Un exemplo concreto é o seguinte. A primeira expresión considérase coma se fose 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

Combinando a notación completa de lista e os operadores ternarios

Un uso útil do operador ternario é cando se procesan listas en notación de comprensión de listas.

Ao combinar o operador ternario e a notación de comprensión da lista, é posible substituír elementos dunha lista ou realizar algún outro procesamento dependendo das condicións.

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 obter máis información sobre a notación de comprensión de listas, consulte o seguinte artigo.

Combinación de funcións anónimas (expresións lambda) e operadores ternarios

O operador ternario, que se pode describir de forma concisa mesmo nunha función anónima (expresión 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

Teña en conta que, aínda que non está relacionado co operador ternario, o exemplo anterior asigna un nome á expresión lambda. Polo tanto, ferramentas de comprobación automática como a convención de codificación PEP8 de Python poden xerar un Aviso.

Isto é porque PEP8 recomenda o uso de def ao asignar nomes ás funcións.

O concepto de PEP8 é o seguinte

  • As expresións lambda úsanse para pasar obxectos invocables como argumentos, por exemplo, sen nomealos
  • Nas expresións lambda, use def para definir polo nome