Una forma alternativa del operador ternario de Python

Recientemente descubrí una alternativa a la construcción estándar de " expression_on_true if predicate else expression_on_false ", que no he visto en los directorios:

(expression_on_false, expression_on_true)[predicate]

imagen

Cómo funciona


  1. Entre paréntesis, se declara una tupla de dos elementos.
  2. Entre corchetes, se calcula el valor del predicado.
  3. Se accede a una tupla en el índice 1 (si el valor del predicado es Verdadero) o 0 (si el valor del predicado es Falso)

Veamos un ejemplo


Supongamos que tenemos un , y necesitamos imprimir "positivo" si el número no es menor que cero, o "nagativo" si el número es menor que cero.


>>> a = 101
>>> ("negative", "positive")[a >= 0]
'positive'
>>> a = -42
>>> ("negative", "positive")[a >= 0]
'negative'
>>> a = 0
>>> ("negative", "positive")[a >= 0]
'positive'

En el primer caso, 101> = 0, por lo que el predicado devuelve True. Al indexar, True se convierte en 1, por lo que la llamada va al elemento con índice 1. En el segundo caso, lo mismo: el predicado es Falso, la llamada va al elemento con índice 0.

Construcción ("negativa", "positiva") [a> = 0] al menos y no mucho más corto que "positivo" si a> = 0 más "positivo" , pero todavía encuentro esta característica interesante

Nota


(gracias a Dasdy )
Si en lugar de constantes sustituimos expresiones en la tupla, de las cuales solo una debe ejecutarse, entonces esta construcción pierde su significado.

All Articles