Як використовувати тернарний оператор Python

Як використовувати тернарний оператор у Python

У цій інструкції ви дізнаєтеся, як застосовувати тернарний оператор у Python. Розглянемо його синтаксис, а також кілька прикладів, щоб зрозуміти його функціонування.

Спочатку ми згадаємо, як працює умовна інструкція if-else, а потім навчимося створювати еквівалентний вираз, використовуючи тернарний оператор.

Далі наведемо кілька прикладів, а потім вивчимо, як відтворити поведінку тернарного оператора Python за допомогою кортежу та словника. Зрештою, ми розглянемо випадки, коли тернарний оператор є більш вигідним.

Почнімо!

Інструкція If-Else в Python: Короткий огляд

Ви можете кодувати, використовуючи Python REPL або онлайн-редактор Python.

Загальний вигляд інструкції if-else в Python такий:

if умова:
    # виконується, якщо умова істинна
else:
    # виконується, якщо умова хибна

У наведеному вище коді “умова” – це вираз, який потрібно перевірити. Якщо він дає результат True, виконується блок if. В іншому випадку, виконуються оператори всередині блоку else.

Ось приклад, де змінній `game_over` присвоюється булеве значення залежно від того, чи значення енергії менше або дорівнює нулю:

  • Якщо `енергія <= 0`, тоді `game_over` стає True.
  • Інакше `game_over` стає False.

У наступному коді показано, як цього досягти за допомогою умовних операторів if-else:

energy = -1

if energy <= 0:
    game_over = True
else:
    game_over = False

print(game_over)
# True

У цьому випадку енергія дорівнює -1, що менше 0. Тому `game_over` набуває значення True.

Тернарний Оператор Python: Синтаксис та Приклади

У Python є тернарний оператор, який працює подібно до тернарного умовного оператора в таких мовах, як C та C++. Ось його загальний синтаксис:

вираз1 if умова else вираз2

Давайте розберемо цей синтаксис:

  • `умова`: Вираз, який треба перевірити.
  • `вираз1`: Вираз, який обчислюється, якщо `умова` є True.
  • `вираз2`: Вираз, що обчислюється, якщо `умова` є False.

Визначимо, що є `вираз1`, `вираз2` та `умова` на основі попереднього прикладу коду if-else.

Об’єднавши все, отримаємо наступне, використовуючи тернарний оператор Python:

game_over = True if energy <= 0 else False
print(game_over)
# True

Розглянемо інший приклад. Припустимо, ви керуєте книгарнею і надаєте знижку клієнтам залежно від їхньої частоти відвідувань за останній рік.

Нехай `numVisits` позначає кількість відвідувань.

  • Якщо `numVisits > 7`, відсоток знижки `discount_perc` дорівнює 20.
  • Інакше `discount_perc` дорівнює 5.

Скористаємося тернарним оператором для присвоєння значення змінній `discount_perc`.

numVisits = 10

discount_perc = 20 if numVisits > 7 else 5

print(discount_perc)
# 20 (оскільки numVisits = 10, що > 7)

Далі розглянемо, як імітувати тернарний оператор за допомогою кортежу та словника Python.

Емуляція Тернарного Оператора за допомогою Кортежу Python

Подібно до інших ітерованих структур у Python, кортежі індексуються з нуля. Таким чином, якщо кортеж має два елементи, `tuple_name[0]` означає перший елемент, а `tuple_name[1]` – другий.

Основні типи даних у Python – це цілі числа, числа з плаваючою комою, рядки та логічні значення. Python підтримує приведення типів, дозволяючи представляти значення одного типу за допомогою еквівалентного значення іншого типу.

Запустіть Python REPL і виконайте наведені приклади. Якщо ви спробуєте перетворити цілі числа на булеві, то помітите наступне:

  • `bool(0)` дорівнює False.
  • `bool(<будь-яке ненульове ціле число>)` повертає True.
>>> bool(0)
False
>>> bool(1)
True
>>> bool(-1)
True
>>> bool(10)
True

Аналогічно, при перетворенні логічних значень на цілі числа маємо:

>>> int(True)
1
>>> int(False)
0

Поєднуючи приведення типів з індексацією, отримуємо:

  • Елемент з індексом 0 у кортежі: значення, що використовується, коли `умова` є False.
  • Елемент з індексом 1 у кортежі: значення, що використовується, коли `умова` є True.

З огляду на вищевикладене, маємо:

>>> numVisits = 10
>>> discount_perc = (5,20)[numVisits > 7]
>>> discount_perc
# 20

Тут `numVisits > 7` дає True, оскільки `numVisits` дорівнює 10. Оскільки `int(True)` дорівнює 1, значення `discount_perc` дорівнює 20, тобто елементу з індексом 1.

Емуляція Тернарного Оператора за допомогою Словника Python

Ви можете використовувати True і False як ключі словника. При цьому `вираз1` та `вираз2` будуть значеннями, відповідними ключам True і False відповідно.

some_dict = {True: вираз1,
             False: вираз2
            }

Що далі? Якщо тепер використовувати `some_dict[умова]`, обчислюється `вираз1`, пов’язаний з ключем True, якщо `умова` є True. Інакше обчислюється `вираз2`.

Знову розглянемо приклад з `discount_perc`, але цього разу використовуючи словник Python.

>>> numVisits = 10
>>> discount_dict = {True: 20, False:5}
>>> discount_perc = discount_dict[numVisits > 7]
>>> discount_perc
# 20

Тут `numVisits = 10`, що більше 7. Таким чином, `numVisits > 7` є True. Отже, `discount_dict[numVisits > 7]` обчислюється як `discount_dict[True]`, що дорівнює 20.

Чи Завжди Варто Використовувати Тернарний Оператор Python?

Тепер ми навчилися застосовувати тернарний оператор. Але чи завжди його треба використовувати? Тернарний оператор не є оптимальним вибором для всіх випадків. Далі ми пояснимо, коли варто віддавати перевагу тернарному оператору, а коли доцільніше використовувати інструкції if-else.

Коротше, ніж Блоки If-Else

Як вже згадувалося, вираз тернарного оператора в Python є більш лаконічним, ніж інструкція if-else. Тому ви можете використовувати його для перевірки умов та оцінки виразів “на льоту”.

У наступному прикладі `nums` – це список зі 100 випадково згенерованих цілих чисел. Для кожного числа ми перевіряємо, чи є воно парним або непарним. І ця перевірка відбувається прямо усередині f-рядка.

import random

nums = [random.choice(range(100)) for i in range(10)]

for num in nums:
    print(f"{num} is {'even' if num%2==0 else 'odd'}")
# Приклад виводу

0 is even
56 is even
6 is even
53 is odd
62 is even
7 is odd
8 is even
77 is odd
41 is odd
94 is even

Тернарний Оператор Вимагає Блоку Else

При використанні умовних операторів if-else блок else є необов’язковим. Розглянемо приклад. Змінна `game_over` стає True, якщо рівень енергії падає до нуля або нижче.

Однак, якщо енергія більша за нуль, змінна `game_over` не буде ініціалізована. Тому, виникне помилка, якщо ви спробуєте її використати.

energy = 5
if energy <= 0:
    game_over = True

print(f"Is the game over? {game_over}")
Traceback (most recent call last):
  File "ternary_op.py", line 39, in <module>
    print(f"Is the game over? {game_over}")
NameError: name 'game_over' is not defined

Один зі способів це виправити – спочатку встановити `game_over` в False, а потім змінити його на True, якщо енергія стане меншою або дорівнюватиме нулю.

energy = 5
game_over = False
if energy <= 0:
    game_over1 = True

print(f"Is the game over? {game_over}")

Однак, при використанні тернарного оператора Python блок else є обов’язковим. Тернарний оператор вимагає, щоб вираз обчислювався, навіть коли умова є False.

game_over = True if energy <= 0 else False

Якщо змінити наведений вище код, видаливши else (тобто `game_over = True if energy <= 0`), ви отримаєте синтаксичну помилку:

File "ternary_op.py", line 42
    game_over = True if energy <= 0
                                  ^
SyntaxError: invalid syntax

Для Перевірки Багатьох Умов Використовуйте Оператори If-Else

Наприклад, кожне питання в наборі питань для співбесіди має певну оцінку складності. Залежно від цієї оцінки, питанню присвоюється один з трьох рівнів складності: легкий, середній або важкий. Нехай:

Оцінка Рівень складності
Менше 10 Легкий
Між 10 та 20 Середній
Більше 20 Важкий

Знаючи оцінку, ви можете визначити рівень складності за допомогою тернарного оператора Python:

score = 12

difficulty_level = "easy" if score < 10 else "hard" if score > 20 else "medium"

print(difficulty_level)
# medium

Вираз тернарного оператора у наведеному вище коді має вигляд:

вираз1 if умова1 else вираз2 if умова2 else вираз3

Хоча він і короткий, його важко читати та аналізувати. На наступному зображенні показано потік управління в цьому випадку.

У наступному коді показано еквівалентну реалізацію з використанням операторів if-else. Як видно, потік управління стає набагато простішим для розуміння, а код читабельнішим.

if score < 10:
    difficulty_level="easy"
elif score > 20:
    difficulty_level="hard"
else:
    difficulty_level="medium"

print(difficulty_level)

Тому, якщо у вас є декілька умов, краще використовувати блоки if-else замість тернарного оператора. Це робить код читабельним та зрозумілим.

Крім того, якщо вам потрібно виконати декілька операцій (залежно від того, чи умова True чи False), розгляньте можливість використання оператора if-else.

Висновок

Ось підсумок того, що ви дізналися у цьому посібнику:

  • У Python тернарний оператор використовується з таким синтаксисом: `вираз1 if умова else вираз2`.
  • Ви можете імітувати тернарний оператор за допомогою кортежів і словників Python.
  • Хоча тернарний оператор може бути коротшою альтернативою блокам if-else, ви маєте переконатися, що код читабельний. Для покращення читабельності можна використовувати оператори if-else, особливо якщо вам потрібно з’єднати кілька умов.

Далі ознайомтеся з посібником про оператори рівності та нерівності в Python.