• en
  • Language: ru
  • Documentation version: latest

6. Тернарные операторы

Тернарные операторы более известны как условные выражения в Python. Эти операторы оценивают что-то, основываясь на том, что условие истинно или нет. Они стали частью Python в версии 2.4.

Вот чертеж и пример использования этих условных выражений.

Блюпринт:

value_if_true if condition else value_if_false

Пример:

is_nice = True
state = "nice" if is_nice else "not nice"

Он позволяет быстро проверить условие вместо многострочного оператора if. Часто это может оказаться очень полезным и сделать ваш код компактным, но при этом сохраняющим работоспособность.

Другой, более непонятный и не очень распространенный пример связан с кортежами. Вот пример кода:

Блюпринт:

(if_test_is_false, if_test_is_true)[test]

Пример:

nice = True
personality = ("mean", "nice")[nice]
print("The cat is ", personality)
# Output: The cat is nice

Это работает просто потому, что True == 1 и False == 0, и поэтому может быть сделано со списками в дополнение к кортежам.

Приведенный выше пример не очень широко используется и вообще не нравится питонистам за то, что он не является питоническим. Кроме того, легко перепутать, куда поместить истинное значение, а куда - ложное в кортеже.

Еще одна причина избегать использования кортежа - это то, что в результате оцениваются оба элемента кортежа, в то время как оператор if-else не оценивает.

Пример:

condition = True
print(2 if condition else 1/0)
#Output is 2

print((1/0, 2)[condition])
#ZeroDivisionError is raised

Это происходит потому, что при использовании троичного оператора tupled сначала строится кортеж, а затем находится индекс. Что касается тернарного оператора if-else, то он следует обычному логическому дереву if-else. Таким образом, если в одном случае может возникнуть исключение на основе условия, или если любой из этих методов требует больших вычислений, лучше избегать использования кортежей.

Короткорукий тернарий.

В python также существует сокращенный тернарный тег, который является более короткой версией обычного тернарного оператора, который вы видели выше.

Синтаксис был введен в Python 2.5 и может быть использован в python 2.5 и выше.

Пример.

>>> True or "Some"
True
>>>
>>> False or "Some"
'Some'

Первое утверждение (True или «Some») вернет True, а второе утверждение (False или «Some») вернет Some.

Это полезно в тех случаях, когда вы хотите быстро проверить вывод функции и выдать полезное сообщение, если вывод пуст:

>>> output = None
>>> msg = output or "No data returned"
>>> print(msg)
No data returned

Или как простой способ определения параметров функции с динамическими значениями по умолчанию:

>>> def my_function(real_name, optional_display_name=None):
>>>     optional_display_name = optional_display_name or real_name
>>>     print(optional_display_name)
>>> my_function("John")
John
>>> my_function("Mike", "anonymous123")
anonymous123