В 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
Няколко условни израза също могат да бъдат обединени с помощта на логически оператори (и, или и т.н.).
- СВЪРЗАНИ:Логически оператори на Python и, или, не (логическа конюнкция, логическа дизюнкция, отрицание)
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 ...
Няма специален начин да се напише това на един ред. Той обаче може да се реализира чрез използване на друг тернарен оператор в израза, който се оценява, когато условният израз на тернарния оператор е false. Изображение на влагане на тернарни оператори.
Въпреки това може би е по-добре да не се използва широко, тъй като намалява четливостта.
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]
За повече информация относно нотацията за разбиране на списък вижте следната статия.
Комбинация от анонимни функции (ламбда изрази) и тернарни оператори
Полезен е тройният оператор, който може да бъде описан кратко дори в анонимна функция (lambda израз).
get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'
print(get_odd_even(1))
# odd
print(get_odd_even(2))
# even
Обърнете внимание, че въпреки че не е свързан с тернарния оператор, горният пример задава име на ламбда израза. Поради това инструментите за автоматична проверка, като например конвенцията за кодиране PEP8 на Python, могат да генерират Предупреждение.
Това е така, защото PEP8 препоръчва използването на def при присвояване на имена на функции.
Концепцията на PEP8 е следната
- Ламбда изразите се използват за предаване на обекти, които могат да бъдат извикани, като аргументи, например, без да ги именувате.
- В ламбда изрази използвайте def, за да дефинирате по име