Pull to refresh

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

Reading time 1 min
Views 13K
Дисклеймер: описанный в статье прием не рекомендуется к приенению. Он описан лишь для демонстрации интересной возможности языка 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)
Если в кортеж вместо констант подставить выражения, из которых должно быть выполнено только одно, то данная конструкция теряет смысл.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+18
Comments 23
Comments Comments 23

Articles