Альтернативная форма тернарного оператора Python

в 13:56, , рубрики: python, ненормальное программирование, тернарный оператор

Недавно я открыл для себя альтернативу стандартной конструкции "expression_on_true if predicate else expression_on_false", которую я не встречал в справочниках:

(expression_on_false, expression_on_true)[predicate]

image

Как это работает

  1. В круглых скобках объявляется кортеж из двух элементов.
  2. В квадратных скобках вычисляется значение предиката.
  3. Происходит обращение к кортежу по индексу 1 (если значение предиката True) или 0 (если значение предиката False)

Разберем на примере

Допустим, у нас есть число a, и нам надо вывести «positive», если число не меньше нуля, или «nagative», если число меньше нуля.


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

В первом случае 101 >= 0, поэтому предикат возвращает True. При индексации True превращается в 1, поэтому обращение идет к элементу с индексом 1. Во втором случае аналогично: предикат равен False, обращение идет к элементу с индексом 0.

Конструкция («negative», «positive»)[a >= 0] хоть и не намного короче чем «positive» if a >= 0 else «positive», но я все же нахожу данную фичу интересной

Примечание

(спасибо Dasdy)
Если в кортеж вместо констант подставить выражения, из которых должно быть выполнено только одно, то данная конструкция теряет смысл.

Автор: DVoropaev

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js