Написание операторов 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

Несколько условных выражений можно также объединить с помощью логических операторов (and, or и т.д.).

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

Комбинированный список Полная нотация и тернарные операторы

Тернарный оператор полезно использовать при обработке списков в нотации list comprehension.

Комбинируя тернарный оператор и нотацию понимания списка, можно заменить элементы списка или выполнить какую-либо другую обработку в зависимости от условий.

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's coding convention PEP8, могут выдать предупреждение.

Это связано с тем, что PEP8 рекомендует использовать def при присвоении имен функциям.

Концепция PEP8 заключается в следующем

  • Лямбда-выражения используются для передачи вызываемых объектов в качестве аргументов, например, без их именования
  • В лямбда-выражениях используйте def для определения по имени
Copied title and URL