Uma forma alternativa do operador ternário do Python

Eu descobri recentemente uma alternativa para a construção padrão de " expression_on_true if predicate else expression_on_false ", que eu não vi nos diretórios:

(expression_on_false, expression_on_true)[predicate]

imagem

Como funciona


  1. Entre parênteses, uma tupla de dois elementos é declarada.
  2. Entre colchetes, o valor do predicado é calculado.
  3. Uma tupla é acessada no índice 1 (se o valor do predicado for Verdadeiro) ou 0 (se o valor do predicado for Falso)

Vejamos um exemplo


Suponha que temos um , e nós precisamos imprimir “positivo” se o número não menor que zero é, ou “nagative” se o número é menor que zero.


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

No primeiro caso, 101> = 0, então o predicado retorna True. Ao indexar, True passa para 1, então a chamada vai para o elemento com o índice 1. No segundo caso, a mesma coisa: o predicado é False, a chamada vai para o elemento com o índice 0.

Construção ("negativa", "positiva") [a> = 0] pelo menos e não muito menor que "positivo" se a> = 0 mais "positivo" , mas ainda acho esse recurso interessante

Nota


(graças a Dasdy )
Se, em vez de constantes, substituirmos expressões na tupla, das quais apenas uma deve ser executada, essa construção perde seu significado.

All Articles