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