operators if - ¿Python tiene un operador condicional ternario?




que es (20)

Para Python 2.5 y posteriores hay una sintaxis 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, hay 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.

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


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 distinto de 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 declaración,

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

Nota: - Este tipo de ramificació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, 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] ;


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.


Sí, fue added en la versión 2.5.
La sintaxis es:

a if condition else b

La primera condition se evalúa, luego a o b se devuelve según el valor Boolean de condition
Si la condition evalúa como verdadera, se devuelve una a, de lo contrario se devuelve b .

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 asignaciones, pass u otras declaraciones en un condicional:

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

En tal caso, tiene que usar una sentencia normal if lugar de una condicional.

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

  • El orden de los argumentos es diferente de muchos otros lenguajes (como C, Ruby, Java, etc.), lo que puede provocar errores cuando las personas que no están familiarizadas con el comportamiento "sorprendente" de Python lo usan (pueden invertir el orden).
  • 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 el pedido, recuerde que si lo 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:


Sí:

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

X = 5 si algo más x = 10

X = [algún valor] si [si esto es cierto, el primer valor evalúa] de lo contrario [otro valor evalúa]



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 Boolean :

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

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

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

Para versiones anteriores a 2.5, hay un 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 expresiones de izquierda a derecha, lo que es más claro en mi opinión.

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


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 entrecejo como algo antipónico (incluso, ruby-ish :), pero personalmente lo encuentro más natural, es decir, cómo lo expresaría normalmente, además de un poco más atractivo visualmente en grandes bloques de código.


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

Simulando el operador ternario de pitón.

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'

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")

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

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

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 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

Sí.

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

Operador Ternario en diferentes lenguajes de programación.

Aquí solo trato de mostrar alguna diferencia importante en el ternary operator entre 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

Ahora puedes ver la belleza del lenguaje python. Es altamente legible y mantenible.


Sí,

básicamente cuando escribimos

i += l; 

el compilador convierte esto a

i = (int)(i + l);

Acabo de comprobar el código del archivo .class .

Realmente una buena cosa para saber





python operators ternary-operator conditional-operator python-2.5