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

Цей посібник навчить вас, як використовувати тернарний оператор у Python. Ви вивчите синтаксис і кілька прикладів коду, щоб зрозуміти, як це працює.

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

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

Давайте почнемо!

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

Ви можете кодувати, запустивши Python REPL або в онлайн-редакторі Python techukraine.net.

Загальний синтаксис оператора if-else у Python такий:

if condition:
    # do this
else:
    # do this

У наведеному вище фрагменті умова позначає умову, яку потрібно перевірити. Якщо умова оцінюється як True, тоді запускається блок if. Якщо умова оцінюється як False, тоді виконуються оператори всередині блоку 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++. Загальний синтаксис для його використання такий:

expression1 if condition else expression2

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

  • умова: умова, яку потрібно перевірити.
  • вираз1: вираз, який потрібно оцінити, чи умова є істинною.
  • вираз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 (as numVisits = 10 which is > 7)

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

Емуляція тернарного оператора за допомогою Python Tuple

Як і всі ітерації в 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 у кортежі: значення, яке буде використано, коли умова має значення Істинна.

Використовуючи вищесказане, маємо наступне:

>>> 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: expression1,
             False: expression2
            }

що робити далі? Тепер, якщо ви використовуєте some_dict[condition], вираз1, що відповідає ключу True, обчислюється, якщо умова має значення True. А вираз2 обчислюється, коли умова має значення False.

Давайте напишемо приклад 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 є істинною. Отже discount_dict[numVisits > 7] обчислюється як discount_dict[True] що дорівнює 20.

Чи завжди слід використовувати тернарний оператор Python?

Поки що ми навчилися використовувати тернарний оператор. Але чи завжди ми повинні використовувати тернарний оператор? Що ж, тернарний оператор може бути не найкращим вибором для всіх випадків використання. У цьому розділі пояснюється, коли ви віддаєте перевагу використанню тернарного оператора над операторами if-else. Ми також розглянемо, коли нам варто розглянути можливість використання оператора if-else замість тернарного оператора.

Більш стисло, ніж блоки If-Else

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

У наступному прикладі nums — це список із 100 випадково згенерованих цілих чисел. Для кожного зі 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'}")
# sample output

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 ніколи не ініціалізується. Тому ви зіткнетеся з помилками, якщо спробуєте отримати доступ до змінної 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

Якщо змінити наведене вище на game_over = True if energy <= 0 шляхом видалення частини else, ви зіткнетеся з синтаксичною помилкою, як показано:

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

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

expression1 if condition1 else expression2 if condition2 else expression3

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

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

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

print(difficulty_level)

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

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

Висновок

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

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

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