В Python есть стиль написания, называемый троичными операторами (условными операторами), который позволяет описать процесс, подобный оператору if, в одной строке.
Ниже приводится пояснение, а также пример кода.
- Базовая запись троичных операторов
if ... elif ... else ...
Опишите это одной строкой- Комбинированный список Полная нотация и тернарные операторы
- Комбинация анонимных функций (лямбда-выражений) и троичных операторов
Более подробную информацию об обычном операторе if см. в следующей статье.
- СООТВЕТСТВУЮЩИЕ:Как писать условные ветви с помощью операторов if в Python
Базовая запись троичных операторов
В языке 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 и т.д.).
- СООТВЕТСТВУЮЩИЕ:Логические операторы Python and, or, not (логическая связь, логическая дизъюнкция, отрицание)
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]
Для получения дополнительной информации о нотации понимания списка см. следующую статью.
- СООТВЕТСТВУЮЩИЕ:Как использовать понимание списков в Python
Комбинация анонимных функций (лямбда-выражений) и троичных операторов
Полезен троичный оператор, который может быть лаконично описан даже в анонимной функции (лямбда-выражении).
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 для определения по имени