Saltar al contenido

El Operador Ternario en Python

Tiene Python un operador ternario condicional

Una duda muy habitual es la siguiente: ¿tiene Python un operador ternario condicional? La respuesta es afirmativa. Te cuento en este breve, pero interesante, artículo, cómo funciona el operador ternario en Python también llamado expresión condicional. Y lee hasta el final, porque aunque no existiera este operador, la magia de Python nos deja simular uno de manera muy elegante.

El operador ternario o expresión condicional en Python nos permite acceder a una de dos opciones a partir de una condición. Su sintaxis es: opcion_1 if condición else opcion_2, en donde se evalúa la condición y se toma opcion_1 si es cierta (True) o se toma opcion_2 si es falsa (False).

Pero este párrafo está muy resumido. Vamos a ahondar un poco más en su funcionamiento y a ver algunos ejemplos.

El operador ternario o expresión condicional en Python

El operador ternario en Python tiene tres partes claramente diferenciadas:

  1. La condición, que llamaremos condición.
  2. La expresión izquierda, que llamaremos izquierda, y que se evalúa si la condición es True y se ignora si es False.
  3. La expresión derecha, que llamaremos derecha, y que se evalúa si la condición es False y se ignora si es True.

Y la sintaxis es la siguiente:

izquierda if condición else derecha

Así, lo primero que se evalúa en toda la expresión condicional es la condición. Si esta es True se ignora la expresión derecha y se evalúa la expresión izquierda. Si condición es False se evalúa la expresión derecha y se ignora izquierda.

Para recordar cómo funciona esto lo podemos leer en lenguaje natural de la siguiente manera: tomamos izquierda si condición es cierta y si no, tomamos derecha.

Veamos algún ejemplo sencillo para terminar de aclarar el funcionamiento:

>>> 10 if True else 20
10
>>> 10 if False else 20
20
>>> c = 18
>>> 10 if c > 15 else 20
10
>>> 10 if c <= 15 else 20
20

Cómo puedes ver, la forma de uso es muy sencilla y una vez te habitúas, resulta casi natural.

La diferencia con un if estándar es que el operador ternario no es una estructura de control que permite dirigir el flujo del programa, sino que actúa como un operador que define una expresión.

Veamos en los siguientes apartados algunos usos comunes de este operador ternario.

El operador ternario para tomar un valor

Uno de los usos más directos del operador es hacer que una variable tome un valor u otro en función de una condición.

Por ejemplo, si necesitamos que una variable v tome un valor 10 si el valor de otra variable p es par o que tome el valor 20 si el valor de p es impar, lo haríamos de esta manera sin usar el operador ternario:

>>> v = 15
>>> if v % 2 == 0:
...     p = 10
... else:
...     p = 20
... 
>>> print(f'{p=}')
p=20

Recordatorio: el operador % nos sirve para calcular el módulo o resto de una división entera. Al dividir por 2 obtendremos siempre 0 si el número es par y 1 si el número es impar. Esta es una forma de comprobar si un número es par o no. Por ejemplo, utilizamos el operador % cuando queremos convertir un número decimal en binario.

Una característica muy interesante de los f-strings es que si después de la variable cuyo valor quieres mostrar por pantalla pones el símbolo =, el print te mostrará además el nombre de la variable como puedes ver en el ejemplo de arriba: p=20.

Esta forma de realizar la asignación a la variable p, aunque válida, es un poco larga y un tanto fea. Usando el operador ternario lo podemos mejorar bastante. Fíjate:

>>> p = 10 if v % 2 == 0 else 20
>>> print(f'{p=}')
p=20

Mucho mejor, ¿no? Fíjate en que se puede hacer directamente la asignación a la variable p con el resultado de la expresión condicional.

15 conceptos fundamentales que necesitas conocer para aprender y dominar Python

Te voy a hacer dos regalos (no uno, sino dos) que hablan de estos 15 conceptos fundamentales de Python: mi Tutorial Básico Interactivo de Python y una cheat sheet de Python en español: La Hoja de Referencia de Python.

Estos regalos son exclusivos para los suscriptores de Código Pitón.

👍 Quiero mis dos regalos

Veamos un pequeño ejemplo para calcular y obtener el máximo de dos números:

>>> x = 10
>>> y = 15
>>> max = x if x >= y else y
>>> print(f'{max}')
15

El operador ternario para ejecutar una expresión o función

Como te conté más arriba, las expresiones izquierda y derecha se evalúan y por tanto se ejecutan si la condición es cierta o falsa, respectivamente.

Gracias a esto podemos poner cualquier expresión y llamadas a funciones en cada una de las dos opciones del operador ternario.

Te muestro algún ejemplo:

>>> v = 15
>>> p = v * 2 if v > 10 else v * 3
>>> print(f'{p=}')
p=30

Ahora haré llamadas a funciones:

>>> def mostrar(valor):
...     print(f'El valor es {valor}')
...
>>> v = 12
>>> mostrar(v * 2) if v > 10 else mostrar(127)
El valor es 24
>>> mostrar(v * 2) if v <= 10 else mostrar(127)
El valor es 127

Creo que ya vas entendiendo la flexibilidad, potencia y facilidad de uso de este operador.

Ten en cuenta que la precedencia del operador a la hora de evaluar una expresión compleja es la mínima, de forma que no te olvides de utilizar los paréntesis si lo necesitas:

>>> 3 + 5 if True else 15
8
>>> 3 + 5 if False else 15
15
>>> 3 + (5 if True else 15)
8
>>> 3 + (5 if False else 15)
18

El operador ternario y la comprensión de listas

El operador ternario se combina muy bien con la comprensión de listas. La compresión de listas es otra característica muy potente de Python y que se hace todavía más interesante si la conjugamos con el operador ternario, pues nos permite alterar la manera en la que se generar los elementos en función de una condición.

Veamos un ejemplo muy sencillo. Vamos a suponer que tenemos una lista inicial con unos pocos valores y necesitamos otra con el doble de cada valor. Usando la comprensión de listas podríamos hacer lo siguiente:

>>> lista = [5, 7, 11, 12, 15, 20, 24]
>>> lista_doble = [ elemento * 2 for elemento in lista ]
>>> print(lista_doble)
[10, 14, 22, 24, 30, 40, 48]

Hasta aquí nada nuevo. Pero, ¿qué pasa si, por ejemplo, necesitamos el doble de aquellos valores que sean menores que 15 y la mitad de aquellos que sean mayores o igual a 15?

Pues ningún problema. Realizamos comprensión de listas de la misma manera, pero utilizamos el operador ternario para generar un valor u otro teniendo en cuenta ese criterio:

>>> lista = [5, 7, 11, 12, 15, 20, 24]
>>> lista_nueva = [ elemento * 2 if elemento < 15 else elemento / 2 for elemento in lista ]
>>> print(lista_nueva)
[10, 14, 22, 24, 7.5, 10.0, 12.0]

¿Es genial o no?

El operador ternario implementado con tuplas

Bueno, vamos a ver ahora un poco de magia de Python.

Primero vamos a recordar que False == 0 y que True == 1. Lo vemos:

>>> False == 0
True
>>> True == 1
True

Es decir, en Python podemos usar False como si fuera un 0 y True como si fuera un 1. Profundizo más en este tema en este artículo sobre el funcionamiento de las condicionales en Python.

Vamos a ver ejemplos:

>>> 10 + True
11
>>> True + True + True
3
>>> int(True)
1
>>> int(False)
0

Dicho de otra manera, si se evalúa una condición en Python obtenemos un valor booleano y puede ser interpretado como un entero 0 o 1.

Ahora bien, si tenemos una tupla con dos valores (valor1, valor2) para poder acceder a cualquier de esos dos valores tendríamos que usar el índice 0 o bien el índice 1.

>>> (10, 15)[0]
10
>>> (10, 15)[1]
15

Pero recuerda que los valores booleanos también son números enteros 0 o 1, por tanto:

>>> (10, 15)[False]
10
>>> (10, 15)[True]
15

Creo que ya ves por dónde voy. Si colocas tus dos opciones en una tupla y entre los corchetes colocas como índice una condición, ¡ya tienes un operador ternario! Magia…

Ten en cuenta que ahora la opción primera es la que se toma si la condición es falsa (índice 0). Si es cierta, se toma la segunda opción (índice 1).

Vamos algunos ejemplos:

>>> v = 15
>>> (10, 20)[v % 2 == 0]
10
>>> a = 25
>>> b = 35
>>> max = (a, b)[a < b] 
>>> print(max)
35

¡Cuidado! Al contrario que en el operador ternario real, en este caso, ambas opciones de la tupla se evalúan siempre, así que has de tener esto en cuenta. Por ejemplo, no podrías hacer llamadas a funciones dentro de la tupla pues se ejecutarían ambas antes de acceder a una o a otra a través de su índice.

Otra cosa a considerar es que tienes que asegurarte de que lo que pongas entre los corchetes tenga realmente un valor booleano, o puedes acabar teniendo un error en ejecución.

Aunque esta solución es interesante, siempre es preferible utilizar el operador ternario. Pero siempre es interesante ver esto porque nos permite profundizar en el comportamiento del lenguaje y aprender un poco más.

Conclusiones

Espero que te haya quedado claro el uso de este operador condicional. Recuerda que la forma preferida es la primera, con if, y que se debe limitar el uso de la solución con tuplas a aquellos contextos en los que pueda tener algo de sentido.

Si te ha gustado esta entrada, considera apuntarte a la lista de correo de Código Pitón, en la que, además de recibir un regalito, podrás aprender trucos y obtener consejos de Python.

 🎁 Tutorial Básico Interactivo y La Hoja de Referencia de Python – ¡Gratis!

La Hoja de Referencia de Python - Código Pitón
¿Quieres mejorar tu Python? Recibe totalmente gratis el Tutorial Básico Interactivo de Python, la Hoja de Referencia de Python y contenido exclusivo como trucos y consejos.



Antes de suscribirte consulta aquí la Información Básica sobre Protección de Datos. Responsable de los datos: Juan Monroy Camafreita. Finalidad de la recogida y tratamiento de los datos personales: enviarte boletín informativo de Python y comunicaciones comerciales. Legitimación: tu consentimiento. Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (MailRelay). Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control. Más información en nuestra política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal, incluida información sobre acceso, conservación, rectificación, eliminación, seguridad y otros temas.