Як використовувати тернарний оператор у 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.