# Тернарные операторы

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

Ниже приведены шаблоны и примеры использования.

**Шаблон:**

```python
condition_if_true if condition else condition_if_false
```

**Пример:**

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

Такой подход позволяет быстро проверить условие, а не писать несколько строчек оператора `if`. Зачастую это очень удобно, поскольку позволяет писать более компактный код, сохраняя его читабельность.

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

**Шаблон:**

```python
(if_test_is_false, if_test_is_true)[test]
```

**Пример:**

```python
nice = True
personality = ("вредная", "добрая")[nice]
print("Кошка ", personality)
# Вывод: Кошка добрая
```

Это работает поскольку в Python `True == 1` и `False == 0`. Помимо кортежей можно использовать списки.

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

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

**Пример:**

```python
condition = True
print(2 if condition else 1/0)
# Вывод: 2

print((1/0, 2)[condition])
# Было вызвано исключение ZeroDivisionError
```

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

**Сокращенный тернарный оператор**

В Python также существует более краткий вариант тернарного оператора. Этот синтакис был добавлен в Python 2.5 и может быть использован в новых версиях.

**Пример:**

```python
True or "Some"
# Вывод: True

False or "Some"
# Вывод: 'Some'
```

Первое выражение (`True or "Some"`) возвращает `True` и второе - `Some`.

Это удобно, когда нужно быстро проверить вернувшееся из функции значение и показать сообщение, если значения не было (вернулся `None`):

```python
func_output = None
msg = func_output or "Не было возвращено данных"
print(msg)
# Вывод: Не было возвращено данных
```
