Напісанне аператараў 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

Звярніце ўвагу, што, хоць і не звязаны з трайным аператарам, прыведзены вышэй прыклад прысвойвае назву лямбда-выразу. Такім чынам, інструменты аўтаматычнай праверкі, такія як канвенцыя кадавання PEP8 Python, могуць генераваць папярэджанне.

Гэта адбываецца таму, што PEP8 рэкамендуе выкарыстоўваць def пры прысваенні імёнаў функцыям.

Канцэпцыя PEP8 заключаецца ў наступным

  • Лямбда-выразы выкарыстоўваюцца для перадачы выкліканых аб’ектаў у якасці аргументаў, напрыклад, не называючы іх
  • У лямбда-выразах выкарыстоўвайце def для вызначэння па імені