Escribir sentencias if en una línea con el operador ternario de Python (operador condicional)

Negocio

Python tiene un estilo de escritura llamado operadores ternarios (operadores condicionales) que pueden describir un proceso como una sentencia if en una sola línea.

Aquí se explica lo siguiente, junto con un código de ejemplo.

  • Escritura básica de operadores ternarios
  • if ... elif ... else ...Describe esto en una línea
  • Combinación de la notación comprensiva de la lista y los operadores ternarios
  • Combinación de funciones anónimas (expresiones lambda) y operadores ternarios

Consulte el siguiente artículo para obtener más información sobre la sentencia if normal.

Escritura básica de operadores ternarios

En Python, el operador ternario puede escribirse como sigue

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

Si quiere cambiar los valores según las condiciones, simplemente escriba cada valor tal cual.

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

Si desea cambiar el procesamiento según las condiciones, describa 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

También son aceptables las expresiones que no devuelven un valor (expresiones que devuelven None). Dependiendo de la condición, se evalúa una de las expresiones y se ejecuta el proceso.

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

Equivale al siguiente código escrito con una sentencia if normal.

a = 1

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

También se pueden concatenar múltiples expresiones condicionales utilizando operadores lógicos (y, o, 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 ...Descripción de una línea

if ... elif ... else ...No hay ninguna forma especial de escribir esto en una sola línea. Sin embargo, se puede realizar utilizando otro operador ternario en la expresión que se evalúa cuando la expresión condicional del operador ternario es falsa. Imagen de anidación de operadores ternarios.

Sin embargo, puede ser mejor no utilizarlo de forma extensiva porque reduce la legibilidad.

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

La siguiente expresión condicional puede interpretarse de las dos maneras siguientes, pero se trata como la primera (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 ejemplo concreto es el siguiente. La primera expresión se considera como si fuera la 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

Combinación de la notación comprensiva de la lista y los operadores ternarios

Un uso útil del operador ternario es cuando se procesan listas en la notación de comprensión de listas.

Combinando el operador ternario y la notación de comprensión de listas, es posible reemplazar elementos de una lista o realizar algún otro procesamiento en función de las condiciones.

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 más información sobre la notación de comprensión de listas, consulte el siguiente artículo.

Combinación de funciones anónimas (expresiones lambda) y operadores ternarios

Es útil el operador ternario, que puede describirse de forma concisa incluso en una función anónima (expresión lambda).

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

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Tenga en cuenta que, aunque no está relacionado con el operador ternario, el ejemplo anterior asigna un nombre a la expresión lambda. Por lo tanto, las herramientas de comprobación automática como la convención de codificación de Python PEP8 pueden generar una Advertencia.

Esto se debe a que PEP8 recomienda el uso de def cuando se asignan nombres a las funciones.

El concepto del PEP8 es el siguiente

  • Las expresiones lambda se utilizan para pasar objetos invocables como argumentos, por ejemplo, sin nombrarlos
  • En las expresiones lambda, utilice def para definir por nombre
Copied title and URL