Si Python no tiene un operador condicional ternario, ¿es posible simularlo utilizando otras construcciones del lenguaje?
Sí, se añadió en la versión 2.5. La sintaxis de la expresión es:
a if condition else b
Primero se evalúa condición
, luego se evalúa exactamente una de las opciones a
o b
y se devuelve en función del valor booleano de condición
. Si condición
se evalúa como Verdadero
, entonces a
se evalúa y devuelve pero b
se ignora, o bien cuando b
se evalúa y devuelve pero a
se ignora.
Esto permite el cortocircuito porque cuando condición
es verdadera sólo se evalúa a
y b
no se evalúa en absoluto, pero cuando condición
es falsa sólo se evalúa b
y a
no se evalúa en absoluto.
Por ejemplo:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Tenga en cuenta que las condicionales son una expresión, no una sentencia. Esto significa que no se pueden utilizar sentencias de asignación o pass
u otras sentencias dentro de una expresión condicional:
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
Sin embargo, puede utilizar expresiones condicionales para asignar una variable de esta manera:
x = a if True else b
Piense en la expresión condicional como un cambio entre dos valores. Es muy útil cuando se encuentra en una situación de "un valor u otro", pero no hace mucho más.
Si necesitas usar sentencias, tienes que usar una sentencia if
normal en lugar de una expresión condicional.
Ten en cuenta que está mal visto por algunos Pythonistas por varias razones:
condición ? a : b
de muchos otros lenguajes (como C, C++, Go, Perl, Ruby, Java, Javascript, etc.), lo que puede dar lugar a errores cuando personas no familiarizadas con el comportamiento "sorprendente" de Python lo utilizan (pueden invertir el orden de los argumentos).if
" puede ser realmente útil, y hacer tu script más conciso, realmente complica tu código)Si tienes problemas para recordar el orden, recuerda que cuando se lee en voz alta, (casi) se dice lo que se quiere decir. Por ejemplo, x = 4 si b > 8 sino 9
se lee en voz alta como x será 4 si b es mayor que 8 sino 9
.
Documentación oficial:
Para las versiones anteriores a la 2.5, ahí está el truco:
[expression] and [on_true] or [on_false]
Puede dar resultados erróneos cuando on_true
tiene un valor booleano falso.1
Aunque tiene la ventaja de evaluar las expresiones de izquierda a derecha, lo cual es más claro en mi opinión.
De la documentación:
Las expresiones condicionales (a veces llamadas "operador ternario") tienen la menor prioridad de todas las operaciones de Python.
La expresión
x if C else y
evalúa primero la condición, C (no x); si C es verdadera, se evalúa x y se devuelve su valor; en caso contrario, se evalúa y y se devuelve su valor.Ver PEP 308 para más detalles sobre las expresiones condicionales.
Nuevo desde la versión 2.5.