¿Python tiene un operador condicional ternario?


6048

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


149
En la documentación oficial de Python 3.0 a la que se hace referencia en un comentario anterior, esto se conoce como "expresiones_condicionales" y se define crípticamente. Esa documentación ni siquiera incluye el término "ternario", por lo que sería difícil encontrarlo a través de Google a menos que supiera exactamente qué buscar. La documentación de la versión 2 es algo más útil e incluye un enlace a "PEP 308" , que incluye mucho contexto histórico interesante relacionado con esta pregunta.
nobar

26
"ternario" (que tiene tres entradas) es una propiedad consecuente de esta implementación, no una propiedad definitoria del concepto. por ejemplo: SQL tiene case [...] { when ... then ...} [ else ... ] endun efecto similar pero no es en absoluto ternario.
user313114

10
también ISO / IEC 9899 (el estándar del lenguaje de programación C) la sección 6.5.15 lo llama "el operador condicional"
user313114

99
Wikipedia cubre esto a fondo en el artículo " ?: ".
HelloGoodbye

99
En los años transcurridos desde el comentario de nobar, la documentación de expresiones condicionales se ha actualizado para decir expresiones condicionales (a veces denominadas "operador ternario") ...
Scott Martin

Respuestas:


7045

Sí, se agregó en la versión 2.5. La sintaxis de la expresión es:

a if condition else b

En primer lugar conditionse evalúa, a continuación, exactamente uno de cualquiera ao bse evalúa y volvió basa en la booleana valor de condition. Si se conditionevalúa como True, entonces ase evalúa y se devuelve pero bse ignora, o bien cuando bse evalúa y se devuelve pero ase ignora.

Esto permite un cortocircuito porque cuando conditiones verdadero solo ase evalúa y bno se evalúa en absoluto, pero cuando conditiones falso solo bse evalúa y ano 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 declaración . Esto significa que no puede usar declaraciones de asignación passu otras declaraciones 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 usar expresiones condicionales para asignar una variable así:

x = a if True else b

Piense en la expresión condicional como el cambio entre dos valores. Es muy útil cuando estás en una situación de "un valor u otro", pero no hace mucho más.

Si necesita usar declaraciones, debe usar una if declaración normal en lugar de una expresión condicional .


Tenga en cuenta que algunos Pythonistas lo desaprueban por varias razones:

  • El orden de los argumentos es diferente al del condition ? a : boperador ternario clásico de muchos otros lenguajes (como C, C ++, Go, Perl, Ruby, Java, Javascript, etc.), lo que puede generar errores cuando las personas no están familiarizadas con Python " sorprendente "comportamiento utilizarlo (pueden invertir el orden de los argumentos).
  • Algunos lo encuentran "difícil de manejar", ya que va en contra del flujo normal de pensamiento (pensando primero en la condición y luego en los efectos).
  • Razones estilísticas. (Aunque el 'en línea if' puede ser realmente útil y hacer que su script sea más conciso, realmente complica su código)

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

Documentación oficial:


269
El orden puede parecer extraño para los codificadores, sin embargo, f(x) = |x| = x if x > 0 else -xsuena muy natural para los matemáticos. También es posible entenderlo como hacer A en la mayoría de casos, excepto cuando C entonces usted debe hacer B en vez ...
Yota

121
Tenga cuidado con el orden de las operaciones al usar esto. Por ejemplo, la línea z = 3 + x if x < y else y. Si x=2y y=1, puede esperar que produzca 4, pero en realidad produciría 1. z = 3 + (x if x > y else y)es el uso correcto.
Kal Zekdor

11
El punto era que si desea realizar evaluaciones adicionales después de evaluar el condicional, como agregar un valor al resultado, deberá agregar la expresión adicional a ambos lados ( z = 3 + x if x < y else 3 + y) o agrupar el condicional ( z = 3 + (x if x < y else y)o z = (x if x < y else y) + 3)
Kal Zekdor

44
@ MrGeek, entiendo lo que quieres decir, así que básicamente anidarías las operaciones: `" foo "si Bool else (" bar "si Bool else" foobar ")`
Dimesio

3
Los programadores necesitan una formulación correcta precisa incluso más que el matemático, porque en matemáticas siempre hay un recurso a los conceptos subyacentes. Un argumento convincente es el operador%, imitando la forma en que se usa "mod" en matemáticas habría sido un desastre. Entonces no, no acepto tu argumento. Es como adherirse a las unidades imperiales. Groetjes Albert
Albert van der Horst

799

Puedes indexar en una tupla:

(falseValue, trueValue)[test]

testnecesita devolver verdadero o falso .
Puede ser más seguro implementarlo siempre como:

(falseValue, trueValue)[test == True]

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

(falseValue, trueValue)[bool(<expression>)]

591
Tenga en cuenta que este siempre evalúa todo, mientras que la construcción if / else solo evalúa la expresión ganadora.
SilverbackNet

117
(lambda: print("a"), lambda: print("b"))[test==true]()
Dustin Getz

15
Cabe señalar que lo que hay dentro de la []s puede ser una expresión arbitraria. Además, por seguridad, puede probar explícitamente la veracidad escribiendo [bool(<expression>)]. La bool()función ha existido desde v2.2.1.
Martineau

12
He hecho un truco similar, solo una o dos veces, pero lo hice, indexando en un diccionario con Truey Falsecomo teclas: {True:trueValue, False:falseValue}[test] no sé si esto es menos eficiente, pero al menos evita todo debate "elegante" versus "feo". No hay ambigüedad de que estés tratando con un booleano en lugar de un int.
JDM


338

Para versiones anteriores a la 2.5, está el truco:

[expression] and [on_true] or [on_false]

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

1. ¿Existe un equivalente del operador ternario "?:" De C?


67
El remedio es usar (test y [true_value] o [false_value]) [0], lo que evita esta trampa.
ThomasH

66
El operador ternario generalmente se ejecuta más rápido (a veces en un 10-25%).
volcán

77
@volcano ¿Tienes fuente para mí?
OrangeTux

44
@OrangeTux Aquí está el código desmontado . Usar el método que ThomasH sugirió sería aún más lento.
mbomb007

265

<expression 1> if <condition> else <expression 2>

a = 1
b = 2

1 if a > b else -1 
# Output is -1

1 if a > b else -1 if a < b else 0
# Output is -1

83
Éste enfatiza la intención principal del operador ternario: la selección de valores. También muestra que más de un ternario se puede encadenar en una sola expresión.
Roy Tinker

66
@ Craig, estoy de acuerdo, pero también es útil saber qué sucederá cuando no haya paréntesis. En el código real, yo también tendería a insertar parens explícitos.
Jon Coombs

159

De la documentación :

Las expresiones condicionales (a veces llamadas "operador ternario") tienen la prioridad más baja de todas las operaciones de Python.

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

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

Nuevo desde la versión 2.5.


120

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

<expression1> if <condition> else <expression2>

que es equivalente a:

if <condition>: <expression1> else: <expression2>

Aquí hay un ejemplo:

result = x if a > b else y

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

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

donde los operandos se evalúan perezosamente .

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 andy oroperadores:

result = (a > b) and x or y

Sin embargo, esto no funcionará si xlo fuera False.

Una posible solución es crear xy yenumerar o tuplas como se muestra a continuación:

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


1
result = {1: x, 0: y}[a > b]es otra variante posible ( Truey en Falserealidad son enteros con valores 1y 0)
Walter Tross

98

Desafortunadamente, el

(falseValue, trueValue)[test]

la solución no tiene comportamiento de cortocircuito; así ambos falseValuey trueValuese evalúan independientemente de la condición. Esto podría ser subóptimo o incluso defectuoso (es decir, ambos trueValuey falseValuepodrían ser métodos y tener efectos secundarios).

Una solución a esto sería

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

(ejecución retrasada hasta que se conozca al ganador;)), pero introduce inconsistencia entre objetos invocables y no invocables. Además, no resuelve el caso cuando se usan propiedades.

Y así, la historia continúa: elegir entre 3 soluciones mencionadas es una compensación entre tener la característica de cortocircuito, usar al menos Зython 2.5 (en mi humilde opinión ya no es un problema) y no ser propenso a errores de " trueValue-evalúa a falso" .


2
Si bien el truco de la tupla de lambdas funciona, tarda aproximadamente 3 veces más que el operador ternario. Es probable que sea una idea razonable si puede reemplazar una larga cadena de if else if.
Perkins

72

Operador ternario en diferentes lenguajes de programación

Aquí solo trato de mostrar alguna diferencia importante ternary operatorentre un par de lenguajes de programació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 programació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


55
Puede sonar obstinado; pero lo que esencialmente dice es que la sintaxis de Python probablemente sea entendida por una persona que nunca vio un operador ternario, mientras que muy pocas personas entenderán la sintaxis más habitual a menos que se les haya dicho primero lo que significa.
fralau

1
Algol68: a = .if. .cierto. .entonces. 1 .else. 0 .fi. Esto puede expresarse también a = (. Verdadero. | 1 | 0) Como de costumbre, Algol68 es una mejora sobre sus sucesores.
Albert van der Horst

63

Para Python 2.5 y posteriores hay una sintaxis específica:

[on_true] if [cond] else [on_false]

En Python anteriores, 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 se condevalúa Truey se on_trueevalúa False, on_falsese devuelve en 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

que puede ser envuelto por:

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

y usado de esta manera:

q(cond, on_true, on_false)

Es compatible con todas las versiones de Python.


2
El comportamiento no es idéntico: q("blob", on_true, on_false)retornos on_false, mientras que on_true if cond else on_falseretornos on_true. Una solución consiste en reemplazar condcon cond is not Noneen estos casos, aunque eso no es una solución perfecta.

55
¿Por qué no en bool(cond)lugar de cond is True? El primero verifica la veracidad de cond, el segundo verifica la igualdad de puntero con el Trueobjeto. Como lo destacó @AndrewCecil, "blob"es verdad pero is not True.
Jonas Kölker

¡Vaya, eso se ve muy chiflado! :) Técnicamente, incluso puedes escribir [on_false, on_True][cond is True]para que la expresión se acorte.
Arseny

No hay corto circuito en esta respuesta. Si on_true y on_false son caros de llamar, esta es una mala respuesta.
Hucker

44

A menudo puedes encontrar

cond and on_true or on_false

pero esto lleva a un 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 esperarías 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

38

¿Python tiene un operador condicional ternario?

Si. Del 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]

Entonces, una operación condicional ternaria tiene la forma:

expression1 if expression2 else expression3

expression3será evaluado perezosamente (es decir, evaluado solo si expression2es falso en un contexto booleano). Y debido a la definición recursiva, puede encadenarlos indefinidamente (aunque puede considerarse un mal estilo).

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

Una nota sobre el uso:

Tenga en cuenta que cada ifdebe seguirse con un else. Las personas que aprenden las comprensiones de listas 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 a SyntaxError: invalid syntax. Entonces, lo anterior es una lógica incompleta (tal vez el usuario espera un no-op en la condición falsa) o lo que se pretende es usar la expresión2 como filtro; observa que lo siguiente es Python legal:

[expression1 for element in iterable if expression2]

expression2funciona 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 algo doloroso escribir lo siguiente:

expression1 if expression1 else expression2

expression1tendrá que ser evaluado 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 utilizar orel comportamiento de acceso directo:

expression1 or expression2

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


1
expression1 or expression2ser similar y con los mismos inconvenientes / positivos que expression1 || expression2en JavaScript
JSDBroughton

1
Gracias, @selurvedu: puede ser confuso hasta que lo entiendas bien. Aprendí el camino difícil, por lo que tu camino podría no ser tan difícil. ;) Usando if sin el else, al final de una expresión de generador o comprensión de lista se filtrará el iterable. En el frente, es una operación condicional ternaria, y requiere lo demás. ¡¡Salud!!
Aaron Hall

@AaronHall Aunque el uso de metasintáctico expressionNpara todas las instancias es consistente, puede ser más fácil de entender con nombres que distingan la expresión de prueba condicional de las dos expresiones de resultado; por ejemplo, result1 if condition else result2. Esto es especialmente evidente cuando se anidan (también conocido como encadenamiento): result1 if condition1 else result2 if condition2 else result3. ¿Ves cuánto mejor se lee de esta manera?
tchrist

@tchrist gracias por la revisión: si miras el historial de revisiones, esta publicación actualmente tiene dos revisiones. La mayoría de mis otras respuestas, especialmente las principales, han sido revisadas una y otra vez. Esta respuesta nunca me llama la atención porque el estado de wiki de la comunidad no me da crédito por el contenido, por lo que nunca veo ningún voto al respecto. Como realmente no tengo tiempo para editar esto ahora, Frog sabe cuándo volverá a llamar mi atención en el futuro. Puedo ver que has editado la respuesta principal, así que siéntete libre de pedir prestado / citar mi material de esta publicación en esa (¡y citarme si es apropiado!)
Aaron Hall

23

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'

¿Por qué no simplemente por result = (y, x)[a < b]qué utiliza la lambdafunción ?
Grijesh Chauhan

55
@GrijeshChauhan Debido a que en expresiones "conformes", por ejemplo, involucrando una llamada de función, etc., esto se ejecutaría en ambos casos. Esto podría no ser deseado.
glglgl

20

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

Sintaxis:

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

1- Método simple para usar 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 anidado 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

1
Tenga en cuenta que el operador ternario es más pequeño (en memoria) y más rápido que el anidado if. Además, su anidado if-elseno es en realidad una reescritura del operador ternario, y producirá una salida diferente para los valores seleccionados de a y b (específicamente si uno es un tipo que implementa un __ne__método extraño ).
Perkins

19

Puedes hacerlo :-

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

Ejemplo:-

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

Esto imprimirá "impar" si el número es impar o "par" si el número es par.


El resultado: - Si la condición es verdadera, se ejecuta exp_1; 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á la expresión_1 pero no la expresión_2. Si "y" algo con 0 (cero), el resultado siempre será fasle. Así que en la siguiente declaración,

0 and exp

La expresión exp no se evaluará en absoluto ya que "y" con 0 siempre se evaluarán a cero y no hay necesidad de evaluar la expresión. Así es como funciona el compilador, 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 compilador).

Pero en caso de

True and exp1 or exp2

La segunda expresión exp2 no se evaluará, ya True and exp1que sería True cuando exp1 no sea falso.

Similarmente 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, pero después de exp1 ya que se usa "o", evaluará la expresión exp2 después de "o".


Nota: - Este tipo de ramificación usando "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 una lista vacía [] o una cadena de caracteres vacía ''), ya que si la 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 exp_1 y exp_2, haga lo siguiente:

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


Si desea usar eso en el contexto de x = [condition] and ([expression_1] or 1) or [expression_2]y se expression_1evalúa como falso, xserá 1, no expression_1. Usa la respuesta aceptada.
moi

18

Más un consejo que una respuesta (no es necesario repetir lo obvio por enésima vez), pero a veces lo uso como un atajo de línea 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 por no ser un pitón (incluso, ruby-ish :), pero personalmente lo encuentro más natural, es decir, cómo lo expresarías normalmente, además de un poco más visualmente atractivo en grandes bloques de código.


55
Prefiero print( 'yes' if conditionX else 'nah' )a tu respuesta. :-)
frederick99

Esto es, si quieres print(), en ambos casos - y se ve un poco más Pythonic, tengo que admitir :) Pero lo que si las expresiones / funciones no son lo mismo - como print('yes') if conditionX else True- para conseguir la print()única en TruthyconditionX
Todor Minakov

Para agregar al comentario de Frederick99, otra razón para evitar print('yes') if conditionX else print('nah')es que proporciona un SyntaxError en Python2.
Thierry Lathuille

La única razón por la que da un error de sintaxis es porque en Python 2 print es una declaración print "yes", mientras que en Python 3 es una función print("yes"). Eso se puede resolver ya sea usándolo como una declaración, o mejor - from future import print_function.
Todor Minakov

18
a if condition else b

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

     condition
  if           else
a                   b 

14

Una de las alternativas a la expresión condicional de Python.

"yes" if boolean else "no"

es el siguiente:

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

que tiene la siguiente extensión agradable:

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

La alternativa más corta sigue siendo:

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

pero no hay alternativa a

yes() if boolean else no()

si quieres evitar la evaluación de yes() y no() , porque en

(no(), yes())[boolean]  # bad

ambos no()y yes()son evaluados.


10

Muchos lenguajes de programación derivados Cgeneralmente tienen la siguiente sintaxis de operador condicional ternario:

<condition> ? <expression1> : <expression2>

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

<expression1> if <condition> else <expression2>

Entonces, primero evalúa la condición. Si regresa True, se evaluará la expresión1 para dar el resultado; de lo contrario , se evaluará la expresión2 . Debido a la mecánica de Lazy Evaluation , solo se ejecutará una expresión.

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

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

# Result is 'High'

Los operadores ternarios se pueden encadenar 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.


10

Como ya se respondió, sí, hay un operador ternario en python:

<expression 1> if <condition> else <expression 2>

Información Adicional:

Si <expression 1>es la condición, puede usar la evaluación de cortocircuito :

a = True
b = False

# Instead of this:
x = a if a else b

# You could use Short-cirquit evaluation:
x = a or b

PD: Por supuesto, una evaluación de cortocircuito no es un operador ternario, pero a menudo el ternario se usa en casos donde el cortocircuito sería suficiente.


1
Votación a favor de esa short-circuitevaluación.
CodeIt

7

SÍ, Python tiene un operador ternario, aquí está la sintaxis 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")

He agregado un ejemplo de declaración de una línea para verificar qué número es grande para elaborarlo más
PythonLover

1
printrealmente no es una buena opción, ya que esto dará un SyntaxError en Python2.
Thierry Lathuille

@Thierry Lathuille aquí utilicé la función print () no la declaración de impresión, la función de impresión es para Python 3 mientras que la declaración de impresión es para Python 2
PythonLover

La pregunta ya se ha hecho en SO, solo pruébela con Python 2 y la verá usted mismo. 'print (' hello ') es una sintaxis perfectamente válida en Python 2.7, pero la forma en que se analiza hace que su código anterior arroje un SyntaxError.
Thierry Lathuille

2

Python tiene una forma ternaria para tareas; Sin embargo, puede haber incluso una forma más corta que las personas deben tener en cuenta.

Es muy común necesitar asignar a una variable un valor u otro dependiendo de una condición.

>>> li1 = None
>>> li2 = [1, 2, 3]
>>> 
>>> if li1:
...     a = li1
... else:
...     a = li2
...     
>>> a
[1, 2, 3]

^ Esta es la forma larga de hacer tales tareas.

A continuación se muestra la forma ternaria. Pero esta no es la forma más sucinta: vea el último ejemplo.

>>> a = li1 if li1 else li2
>>> 
>>> a
[1, 2, 3]
>>> 

Con Python, simplemente puede usar orpara tareas alternativas.

>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> 

Lo anterior funciona como li1es Noney el interp trata eso como falso en expresiones lógicas. Luego, el interp continúa y evalúa la segunda expresión, que no es Noney no es una lista vacía, por lo que se asigna a a.

Esto también funciona con listas vacías. Por ejemplo, si desea asignar ala lista que tenga elementos.

>>> li1 = []
>>> li2 = [1, 2, 3]
>>> 
>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> 

Sabiendo esto, puede simplemente realizar tales tareas cada vez que las encuentre. Esto también funciona con cadenas y otros iterables. Puede asignar acualquier cadena que no esté vacía.

>>> s1 = ''
>>> s2 = 'hello world'
>>> 
>>> a = s1 or s2
>>> 
>>> a
'hello world'
>>> 

Siempre me ha gustado la sintaxis de C ternary, ¡pero Python va un paso más allá!

Entiendo que algunos pueden decir que esta no es una buena opción estilística porque se basa en mecanismos que no son evidentes de inmediato para todos los desarrolladores. Personalmente no estoy de acuerdo con ese punto de vista. Python es un lenguaje rico en sintaxis con muchos trucos idiomáticos que no son evidentes de inmediato para el dabler. Pero cuanto más aprenda y comprenda la mecánica del sistema subyacente, más lo apreciará.


1

Otras respuestas hablan correctamente sobre el operador ternario de Python. Me gustaría complementar mencionando un escenario para el que se usa a menudo el operador ternario, pero para el cual existe una mejor expresión idiomática. Este es el escenario de usar un valor predeterminado.

Supongamos que queremos usar option_valueun valor predeterminado si no está configurado:

run_algorithm(option_value if option_value is not None else 10)

o simplemente

run_algorithm(option_value if option_value else 10)

Sin embargo, una solución cada vez mejor es simplemente escribir

run_algorithm(option_value or 10)

-2

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)

saldrá

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

1
Si bien es útil para problemas similares, este no es un condicional ternario. Funciona para reemplazar x if x else y, pero no x if z else y.
Perkins

-2

Una forma ordenada de encadenar múltiples operadores:

f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'

array = [(0,0),(0,1),(1,0),(1,1)]

for a in array:
  x, y = a[0], a[1]
  print(f(x,y))

# Output is:
#   equal,
#   less,
#   greater,
#   equal

-2

Encuentro engorroso la sintaxis predeterminada de Python val = a if cond else b, así que a veces hago esto:

iif = lambda (cond, a, b): a if cond else b
# so I can then use it like:
val = iif(cond, a, b)

Por supuesto, tiene la desventaja de evaluar siempre ambos lados (a y b), pero la sintaxis es mucho más clara para mí.


Esto parece ser el doble de la cantidad de trabajo, más uso de RAM y más ofuscado que la val = a if cond else bdeclaración más simple .
eatsfood

-3
is_spacial=True if gender = "Female" else (True if age >= 65 else False)

** **

Se puede anidar según su necesidad. la mejor de las suertes

** **

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.