Написання операторів if в один рядок за допомогою потрійного оператора Python (умовного оператора)

Бізнес

Python має стиль написання, який називається трійковими операторами (умовними операторами), які можуть описувати процес, як оператор if, в одному рядку.

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

  • Основи написання потрійних операторів
  • if ... elif ... else ...Опишіть це одним рядком
  • Комбінування списку комплексних позначень і потрійних операторів
  • Поєднання анонімних функцій (лямбда-виразів) і потрійних операторів

Перегляньте наступну статтю для отримання додаткової інформації про звичайний оператор if.

Основи написання потрійних операторів

У Python тернарний оператор можна записати так

Expression evaluated when the conditional expression is true if conditional expression else Expression evaluated when the conditional expression is false

Якщо ви хочете змінити значення відповідно до умов, просто запишіть кожне значення так, як воно є.

Value to return if conditional expression is true if conditional expression else Value to return if conditional expression is false
a = 1
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# odd

a = 2
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# even

Якщо ви хочете змінити обробку відповідно до умов, опишіть кожен вираз.

a = 1
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 3

a = 2
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 4

Вирази, які не повертають значення (вирази, які повертають None), також прийнятні. Залежно від умови обчислюється один із виразів і виконується процес.

a = 1
print('even') if a % 2 == 0 else print('odd')
# odd

Еквівалентно наступному коду, написаному за допомогою звичайного оператора if.

a = 1

if a % 2 == 0:
    print('even')
else:
    print('odd')
# odd

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

a = -2
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# negative and even

a = -1
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# positive or odd

if ... elif ... else ...Опис в один рядок

if ... elif ... else ...Немає спеціального способу написати це в одному рядку. Однак це можна реалізувати, використовуючи інший трійковий оператор у виразі, який оцінюється, коли умовний вираз трійкового оператора є хибним. Зображення вкладених потрійних операторів.

Проте, можливо, краще не використовувати його широко, оскільки це зменшує читабельність.

a = 2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# positive

a = 0
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# zero

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

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

A if condition 1 else B if condition 2 else C
1. A if condition 1 else ( B if condition 2 else C )
2. ( A if condition 1 else B ) if condition 2 else C 

Конкретний приклад такий. Перший вираз розглядається як другий.

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

result = 'negative' if a < 0 else ('positive' if a > 0 else 'zero')
print(result)
# negative

result = ('negative' if a < 0 else 'positive') if a > 0 else 'zero'
print(result)
# zero

Комбінування списку комплексних позначень і потрійних операторів

Тернарний оператор корисно використовувати під час обробки списків у нотації для розуміння списку.

Комбінуючи потрійний оператор і нотацію розуміння списку, можна замінити елементи списку або виконати іншу обробку залежно від умов.

l = ['even' if i % 2 == 0 else i for i in range(10)]
print(l)
# ['even', 1, 'even', 3, 'even', 5, 'even', 7, 'even', 9]
l = [i * 10 if i % 2 == 0 else i for i in range(10)]
print(l)
# [0, 1, 20, 3, 40, 5, 60, 7, 80, 9]

Щоб отримати докладнішу інформацію про нотацію розуміння списку, перегляньте наступну статтю.

Поєднання анонімних функцій (лямбда-виразів) і потрійних операторів

Тернарний оператор, який можна коротко описати навіть в анонімній функції (лямбда-вираз), є корисним.

get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Зауважте, що, хоча наведений вище приклад не пов’язаний з потрійним оператором, він присвоює ім’я лямбда-виразу. Таким чином, інструменти автоматичної перевірки, такі як конвенція Python про кодування PEP8, можуть генерувати попередження.

Це тому, що PEP8 рекомендує використовувати def при призначенні імен функціям.

Концепція PEP8 полягає в наступному

  • Лямбда-вирази використовуються, наприклад, для передачі викликаних об’єктів як аргументів, не називаючи їх
  • У лямбда-виразах використовуйте def для визначення імені