triple - ¿Python tiene un operador condicional ternario?




triple condicional python (16)

¿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 expresión2 como filtro. Observa 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 razones de claridad, ya que contienen mucho significado en muy poca sintaxis.

https://code.i-harness.com

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


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.


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

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

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.


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?


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

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

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

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

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]


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'

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)

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

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




python-2.5