¿Python tiene un operador condicional ternario?

Si Python no tiene un operador condicional ternario, ¿es posible simular uno usando otras construcciones de lenguaje?

Sí, fue agregado en la versión 2.5. La syntax de expresión es:

 a if condition else b 

Se evalúa la primera condition , luego se evalúa y devuelve exactamente uno de los dos a o b según el valor booleano de la condition . Si la condition evalúa como True , entonces a se evalúa y se devuelve pero b se ignora, o bien, cuando b se evalúa y se devuelve pero a se ignora.

Esto permite el cortocircuito porque cuando la condition es verdadera solo se evalúa a y b no se evalúa en absoluto, pero cuando la condition es falsa solo 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 los condicionales son una expresión , no una statement . Esto significa que no puede usar las declaraciones de asignación o el pass u otras declaraciones dentro de una expresión condicional:

 >>> pass if False else x = 3 File "", line 1 pass if False else x = 3 ^ SyntaxError: invalid syntax 

En tal caso, debe utilizar una instrucción if normal en lugar de una expresión condicional.


Tenga en cuenta que está mal visto por algunos pitonistas por varias razones:

  • ¿El orden de los argumentos es diferente al de la condition ? a : b clásica condition ? a : b Operador ternario a condition ? a : b de muchos otros idiomas (como C, C ++, Go, Perl, Ruby, Java, Javascript, etc.), que pueden provocar errores cuando personas que no están familiarizadas con el comportamiento “sorprendente” de Python lo utilizan (pueden revertir el orden del argumento).
  • Algunos lo consideran “poco manejable”, ya que va en contra del flujo normal de pensamiento (pensando primero en la condición y luego en los efectos).
  • Razones estilísticas.

Si tiene problemas para recordar la orden, recuerde que cuando la lee en voz alta (casi) dice lo que quiere decir. Por ejemplo, x = 4 if b > 8 else 9 se lee en voz alta, ya que x will be 4 if b is greater than 8 otherwise 9 .

Documentación oficial:

  • Expresiones condicionales
  • ¿Hay un equivalente de C “?:” Operador ternario?

Puede indexar en una tupla:

 (falseValue, trueValue)[test] 

test debe devolver verdadero o falso .
Podría ser más seguro implementarlo siempre como:

 (falseValue, trueValue)[test == True] 

o puede usar el bool() incorporado bool() para asegurar un valor booleano :

 (falseValue, trueValue)[bool()] 

Para versiones anteriores a 2.5, hay un truco:

 [expression] and [on_true] or [on_false] 

Puede dar resultados erróneos cuando on_true tiene un valor booleano falso. 1
Aunque tiene el beneficio de evaluar expresiones de izquierda a derecha, lo que es más claro en mi opinión.

1. ¿Hay un equivalente de C “?:” Operador ternario?

expresión1 si condición más expresión2

 >>> a = 1 >>> b = 2 >>> 1 if a > b else -1 -1 >>> 1 if a > b else -1 if a < b else 0 -1 

De la documentación :

Las expresiones condicionales (a veces llamadas “operadores ternarios”) tienen la prioridad más baja de todas las operaciones de Python.

La expresión x if C else y primero evalúa la condición, C ( no x ); si C es verdadero, se evalúa x y se devuelve su valor; de lo contrario, se evalúa y y se devuelve su valor.

Vea PEP 308 para más detalles sobre expresiones condicionales.

Nuevo desde la versión 2.5.

Un operador para una expresión condicional en Python se agregó en 2006 como parte de la Propuesta 308 de mejora de Python . ¿Su forma difiere del operador común ?: y es:

  if  else  

que es equivalente a:

 if :  else:  

Aquí hay un ejemplo:

 result = x if a > b else y 

Otra syntax que se puede usar (compatible con versiones anteriores a 2.5):

 result = (lambda:y, lambda:x)[a > b]() 

donde los operandos son perezosamente evaluados .

Otra forma es indexando una tupla (que no es consistente con el operador condicional de la mayoría de los otros idiomas):

 result = (y, x)[a > b] 

o diccionario construido explícitamente:

 result = {True: x, False: y}[a > b] 

Otro método (menos confiable), pero más simple es usar and / or operadores:

 result = (a > b) and x or y 

Sin embargo, esto no funcionará si x sería False .

Una posible solución es hacer listas x e y tuplas como en lo siguiente:

 result = ((a > b) and [x] or [y])[0] 

o:

 result = ((a > b) and (x,) or (y,))[0] 

Si está trabajando con diccionarios, en lugar de usar un condicional ternario, puede aprovechar get(key, default) , por ejemplo:

 shell = os.environ.get('SHELL', "/bin/sh") 

Fuente: ?: En Python en Wikipedia

@arriba:

Desafortunadamente, el

 (falseValue, trueValue)[test] 

la solución no tiene un comportamiento de cortocircuito; por lo tanto, tanto falseValue como trueValue se evalúan independientemente de la condición. Esto podría ser subóptimo o incluso con errores (es decir, tanto trueValue como falseValue podrían ser métodos y tener efectos secundarios).

Una solución para esto sería

 (lambda: falseValue, lambda: trueValue)[test]() 

(la ejecución se retrasa hasta que se conoce al ganador;)), pero introduce inconsistencia entre los objetos que se pueden llamar y los que no se pueden llamar. Además, no resuelve el caso cuando se utilizan propiedades.

Y así continúa la historia: elegir entre las 3 soluciones mencionadas es un compromiso entre tener la función de cortocircuito, usar al menos Python 2.5 (IMHO ya no es un problema) y no ser propenso a “trueValue-evalates-to-false” errores

Para Python 2.5 y más reciente hay una syntax específica:

 [on_true] if [cond] else [on_false] 

En Pythons más antiguos no se implementa un operador ternario, pero es posible simularlo.

 cond and on_true or on_false 

Sin embargo, existe un problema potencial, que si cond evalúa como True y on_true evalúa como False , se devuelve on_true lugar de on_true . Si desea este comportamiento, el método es correcto, de lo contrario, use esto:

 {True: on_true, False: on_false}[cond is True] # is True, not == True 

el cual puede ser envuelto por:

 def q(cond, on_true, on_false) return {True: on_true, False: on_false}[cond is True] 

y utilizado de esta manera:

 q(cond, on_true, on_false) 

Es compatible con todas las versiones de Python.

Operador Ternario en diferentes lenguajes de progtwigción.

Aquí solo trato de mostrar una diferencia importante en el ternary operator entre un par de lenguajes de progtwigción.

Operador Ternario en Javascript

 var a = true ? 1 : 0; # 1 var b = false ? 1 : 0; # 0 

Operador Ternario En Ruby

 a = true ? 1 : 0 # 1 b = false ? 1 : 0 # 0 

Operador ternario en Scala

 val a = true ? 1 | 0 # 1 val b = false ? 1 | 0 # 0 

Operador ternario en progtwigción r

 a <- if (TRUE) 1 else 0 # 1 b <- if (FALSE) 1 else 0 # 0 

Operador ternario en Python

 a = 1 if True else 0 # 1 b = 1 if False else 0 # 0 

A menudo puede encontrar

 cond and on_true or on_false 

pero esto lleva al problema cuando on_true == 0

 >>> x = 0 >>> print x == 0 and 0 or 1 1 >>> x = 1 >>> print x == 0 and 0 or 1 1 

donde se esperaría para un operador ternario normal este resultado

 >>> x = 0 >>> print 0 if x == 0 else 1 0 >>> x = 1 >>> print 0 if x == 0 else 1 1 

Absolutamente, y es increíblemente fácil de entender.

 general syntax : first_expression if bool_expression_is_true else second_expression Example: x= 3 if 3 > 2 else 4 # assigns 3 to x if the boolean expression evaluates to true or 4 if it is false 

¿Python tiene un operador condicional ternario?

Sí. Desde el archivo de gramática :

 test: or_test ['if' or_test 'else' test] | lambdef 

La parte de interés es:

 or_test ['if' or_test 'else' test] 

Así, una operación condicional ternaria es de la forma:

 expression1 if expression2 else expression3 

expression3 se evaluará perezosamente (es decir, se evaluará solo si expression2 es falsa en un contexto booleano). Y debido a la definición recursiva, puede encadenarlos indefinidamente (aunque puede considerarse un estilo malo).

 expression1 if expression2 else expression3 if expression4 else expression5 # and so on 

Una nota sobre el uso:

Tenga en cuenta que cada if debe ser seguido con un else . La comprensión de las listas de aprendizaje de las personas y las expresiones generadoras pueden encontrar que esta es una lección difícil de aprender; lo siguiente no funcionará, ya que Python espera una tercera expresión para otra cosa:

 [expression1 if expression2 for element in iterable] # ^-- need an else here 

que plantea un SyntaxError: invalid syntax . Por lo tanto, lo anterior es una pieza de lógica incompleta (tal vez el usuario espera una no-op en la condición falsa) o lo que se pretende es usar expression2 como un filtro, señala que lo siguiente es legal de Python:

 [expression1 for element in iterable if expression2] 

expression2 funciona como un filtro para la comprensión de la lista y no es un operador condicional ternario.

Sintaxis alternativa para un caso más estrecho:

Puede resultarle un poco doloroso escribir lo siguiente:

 expression1 if expression1 else expression2 

expression1 tendrá que evaluarse dos veces con el uso anterior. Puede limitar la redundancia si es simplemente una variable local. Sin embargo, un lenguaje Pythonic común y eficaz para este caso de uso es usar or el método abreviado:

 expression1 or expression2 

Lo cual es equivalente en semántica. Tenga en cuenta que algunas guías de estilo pueden limitar este uso por motivos de claridad, ya que contienen mucho significado en muy poca syntax.

Simulando el operador ternario de python.

Por ejemplo

 a, b, x, y = 1, 2, 'a greather than b', 'b greater than a' result = (lambda:y, lambda:x)[a > b]() 

salida:

 'b greater than a' 

Puedes hacerlo :-

[condition] and [expression_1] or [expression_2] ;

Ejemplo:-

print(number%2 and "odd" or "even")

Esto imprimiría “impar” si el número es impar o “par” si el número es par.


El resultado: – Si la condición es verdadera, exp_1 se ejecuta, de lo contrario se ejecuta exp_2.

Nota: – 0, Ninguno, Falso, lista vacía, emptyString se evalúa como Falso. Y cualquier dato que no sea 0 se evalúa como Verdadero.

Así es como funciona:

si la condición [condición] se convierte en “Verdadero”, entonces se evaluará expresión_1 pero no expresión_2. Si “y” algo con 0 (cero), el resultado siempre será fasle. Por lo tanto, en la siguiente statement,

 0 and exp 

La expresión exp no se evaluará en absoluto, ya que “y” con 0 siempre se evaluará a cero y no hay necesidad de evaluar la expresión. Así es como funciona el comstackdor, en todos los idiomas.

En

 1 or exp 

la expresión exp no se evaluará en absoluto ya que “o” con 1 siempre será 1. Por lo tanto, no se molestará en evaluar la expresión exp, ya que el resultado será 1 de todos modos. (métodos de optimización del comstackdor).

Pero en caso de

 True and exp1 or exp2 

La segunda expresión exp2 no se evaluará ya que True and exp1 serían True si exp1 no es false.

Del mismo modo en

 False and exp1 or exp2 

La expresión exp1 no se evaluará ya que False es equivalente a escribir 0 y hacer “y” con 0 sería 0 en sí mismo, pero después de exp1, ya que “o” se usa, evaluará la expresión exp2 después de “o”.


Nota: – Este tipo de bifurcación con “o” y “y” solo se puede usar cuando la expresión_1 no tiene un valor de Verdad de Falso (o 0 o Ninguno o lista vacía [] o cadena vacía ”.), Ya que si expresión_1 se convierte en Falso, entonces la expresión_2 se evaluará debido a la presencia “o” entre exp_1 y exp_2.

En caso de que aún desee que funcione para todos los casos, independientemente de los valores de verdad de exp_1 y exp_2, haga lo siguiente:

[condition] and ([expression_1] or 1) or [expression_2] ;

El operador condicional ternario simplemente permite probar una condición en una sola línea, reemplazando la multilínea if-else haciendo que el código sea compacto.

Sintaxis:

[on_true] si [expresión] else [on_false]

1- Método simple para usar el operador ternario:

 # Program to demonstrate conditional operator a, b = 10, 20 # Copy value of a in min if a < b else copy b min = a if a < b else b print(min) # Output: 10 

2- Método directo de uso de tuplas, diccionario y lambda:

 # Python program to demonstrate ternary operator a, b = 10, 20 # Use tuple for selecting an item print( (b, a) [a < b] ) # Use Dictionary for selecting an item print({True: a, False: b} [a < b]) # lamda is more efficient than above two methods # because in lambda we are assure that # only one expression will be evaluated unlike in # tuple and Dictionary print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10 

3- El operador ternario se puede escribir como nested if-else:

 # Python program to demonstrate nested ternary operator a, b = 10, 20 print ("Both a and b are equal" if a == b else "a is greater than b" if a > b else "b is greater than a") 

El enfoque anterior se puede escribir como:

 # Python program to demonstrate nested ternary operator a, b = 10, 20 if a != b: if a > b: print("a is greater than b") else: print("b is greater than a") else: print("Both a and b are equal") # Output: b is greater than a 

Más una sugerencia que una respuesta (no es necesario repetir lo obvio por centésimo tiempo), pero a veces lo uso como un atajo de oneliner en tales construcciones:

 if conditionX: print('yes') else: print('nah') 

, se convierte en:

 print('yes') if conditionX else print('nah') 

Algunos (muchos 🙂 pueden fruncir el ceño como algo antipónico (incluso, ruby-ish :), pero personalmente lo encuentro más natural, es decir, cómo lo expressía normalmente, además de un poco más atractivo visualmente en grandes bloques de código.

 In [1]: a = 1 if False else 0 In [2]: a Out[2]: 0 In [3]: b = 1 if True else 0 In [4]: b Out[4]: 1 

Sí, puedes usarlo de esa manera:

 is_fat = True state = "fat" if is_fat else "not fat" 

Leer más sobre el operador condicional ternario.

 a if condition else b 

Solo memorice esta pirámide si tiene problemas para recordar:

  condition if else ab 

SÍ, Python tiene un operador ternario, aquí está la syntax y un código de ejemplo para demostrar lo mismo 🙂

 #[On true] if [expression] else[On false] # if the expression evaluates to true then it will pass On true otherwise On false a= input("Enter the First Number ") b= input("Enter the Second Number ") print("A is Bigger") if a>b else print("B is Bigger") 

Sí.

 >>> b = (True if 5 > 4 else False) >>> print b True 

Sintaxis: El operador ternario se dará como:

 [on_true] if [expression] else [on_false] 

p.ej

 x, y = 25, 50 big = x if x < y else y print(big) 

Muchos lenguajes de progtwigción derivados de C suelen tener la siguiente syntax del operador condicional ternario:

  ?  :  

Al principio, el D ictator F o L ife de Python B (me refiero a Guido van Rossum, por supuesto) lo rechazó (como estilo no Pythonic), ya que es bastante difícil de entender para las personas que no están acostumbradas al lenguaje C Además, el signo de dos puntos : ya tiene muchos usos en Python . Después de que se aprobó PEP 308 , Python finalmente recibió su propia expresión condicional de atajo (lo que usamos ahora):

  if  else  

Entonces, en primer lugar se evalúa la condición. Si devuelve True , se evaluará expression1 para obtener el resultado; de lo contrario, se evaluará expression2 . Debido a la mecánica de evaluación perezosa , solo se ejecutará una expresión.

Aquí hay algunos ejemplos (las condiciones serán evaluadas de izquierda a derecha):

 pressure = 10 print('High' if pressure < 20 else 'Critical') # Result is 'High' 

Los operadores ternarios pueden ser encadenados en serie:

 pressure = 5 print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical') # Result is 'Normal' 

El siguiente es el mismo que el anterior:

 pressure = 5 if pressure < 20: if pressure < 10: print('Normal') else: print('High') else: print('Critical') # Result is 'Normal' 

Espero que esto ayude.

Una de las alternativas a la expresión condicional de Python es la siguiente:

 {True:"yes", False:"no"}[boolean] 

que tiene la siguiente extensión agradable:

 {True:"yes", False:"no", None:"maybe"}[boolean_or_none] 

El alterativo más corto permanece:

 ("no", "yes")[boolean] 

pero no hay alternativa si desea evitar la evaluación de yes() y no() en lo siguiente:

 yes() if [condition] else no() 

Sí:

Digamos que quieres darle a la variable x algún valor si alguna bool es verdadera y lo mismo

x = 5 if something else x = 10

x = [some value] if [if this is true first value evaluates] else [other value evaluates]

El operador es “condicional”. Ternario solo significa que se necesitan tres operandos. No llamamos al operador + “binario”. No hay razón para seguir haciendo esto con condicional. Si es más rápido o más compacto que if-else está al lado del punto. Lo que importa es que es una expresión, lo que permite que se incruste en otras expresiones. Si se usa correctamente, reduce la redundancia y las oportunidades de diferencias difíciles de detectar.

Si la variable está definida y desea verificar si tiene valor, puede simplemente a or b

 def test(myvar=None): # shorter than: print myvar if myvar else "no Input" print myvar or "no Input" test() test([]) test(False) test('hello') test(['Hello']) test(True) 

dará salida

 no Input no Input no Input hello ['Hello'] True 

Puede usar la syntax de expresión para el operador ternario en python:

 a if condition else b 

Donde ‘a’ es el primer resultado (predeterminado), es decir, cuando la condición es verdadera, y ‘b’ es el segundo resultado, es decir, cuando la condición es falsa.

 x=10 result='even number' if x%2==0 else 'odd number' print(result) 

La salida del código anterior será: ‘número par’