Pisanje stavkov if v eni vrstici s Pythonovim ternarnim operatorjem (pogojni operator)

Posel

Python ima slog pisanja, imenovan ternarni operatorji (pogojni operatorji), ki lahko v eni vrstici opiše postopek, kot je izjava if.

V nadaljevanju je pojasnjeno naslednje, skupaj z vzorčno kodo.

  • Osnovno pisanje ternarnih operatorjev
  • if ... elif ... else ...To opišite v eni vrstici
  • Kombiniranje celovitega zapisa seznama in ternarnih operatorjev
  • Kombinacija anonimnih funkcij (izrazov lambda) in ternarnih operatorjev

Za več informacij o običajnem stavku if glejte naslednji članek.

Osnovno pisanje ternarnih operatorjev

V Pythonu lahko ternarni operator zapišemo na naslednji način

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

Če želite spreminjati vrednosti glede na pogoje, preprosto zapišite vsako vrednost tako, kot je.

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

Če želite preklopiti obdelavo glede na pogoje, opišite vsak izraz.

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

Sprejemljivi so tudi izrazi, ki ne vračajo vrednosti (izrazi, ki vračajo None). Glede na pogoj se ovrednoti eden od izrazov in izvede postopek.

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

Enakovredno naslednji kodi, zapisani z običajnim stavkom if.

a = 1

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

Več pogojnih izrazov lahko združite tudi z uporabo logičnih operatorjev (and, or itd.).

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 ...Enovrstični opis

if ... elif ... else ...Ni posebnega načina, kako to zapisati v eno vrstico. Lahko pa ga uresničimo tako, da v izrazu uporabimo še en ternarni operator, ki se ovrednoti, ko je pogojni izraz ternarnega operatorja napačen. Slika gnezdenja ternarnih operatorjev.

Vendar je morda bolje, da ga ne uporabljate v velikem obsegu, saj zmanjšuje berljivost.

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

Naslednji pogojni izraz je mogoče razlagati na naslednja dva načina, vendar ga obravnavamo kot prvega (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 

Konkreten primer je naslednji. Prvi izraz se obravnava, kot da bi bil drugi izraz.

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

Kombiniranje celovitega zapisa seznama in ternarnih operatorjev

Uporabna uporaba trinivojskega operatorja je obdelava seznamov v zapisu za razumevanje seznamov.

S kombinacijo ternarnega operatorja in zapisa za razumevanje seznama je mogoče zamenjati elemente seznama ali opraviti drugo obdelavo glede na pogoje.

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]

Za več informacij o zapisu za razumevanje seznamov glejte naslednji članek.

Kombinacija anonimnih funkcij (izrazov lambda) in ternarnih operatorjev

Uporaben je trojni operator, ki ga je mogoče jedrnato opisati tudi v anonimni funkciji (izraz 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

Upoštevajte, da zgornji primer izrazu lambda dodeli ime, čeprav ni povezan s ternarnim operatorjem. Zato lahko orodja za samodejno preverjanje, kot je Pythonova kodirna konvencija PEP8, ustvarijo opozorilo.

PEP8 namreč priporoča uporabo def pri dodeljevanju imen funkcijam.

Koncept PEP8 je naslednji

  • Z izrazi lambda lahko kot argumente posredujete predmete, ki jih je mogoče klicati, ne da bi jih poimenovali.
  • V lambda izrazih uporabite def za opredelitev z imenom