Pythonil on kirjutamisviis, mida nimetatakse ternaaroperaatoriteks (tingimusoperaatoriteks), millega saab kirjeldada protsessi nagu if-lause ühes reas.
Siin selgitatakse järgmist koos näidiskoodiga.
- Kolmikoperaatorite põhikirjutamine
if ... elif ... else ...
Kirjeldage seda ühe reaga- Loetelu koondnomenklatuuri ja kolmikoperatsioonide kombineerimine
- Anonüümsete funktsioonide (lambda-avalduste) ja kolmikoperaatorite kombineerimine
Lisateavet tavalise if-avalduse kohta leiate järgmisest artiklist.
Kolmikoperaatorite põhikirjutamine
Pythonis saab ternaarse operaatori kirjutada järgmiselt
Expression evaluated when the conditional expression is true if conditional expression else Expression evaluated when the conditional expression is false
Kui soovite väärtusi vastavalt tingimustele vahetada, kirjutage lihtsalt iga väärtus sellisena, nagu see on.
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
Kui soovite töötlemist vastavalt tingimustele ümber lülitada, kirjeldage iga väljendus.
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
Lubatud on ka väljendid, mis ei tagasta väärtust (väljendid, mis tagastavad None). Sõltuvalt tingimusest hinnatakse üks väljenditest ja käivitatakse protsess.
a = 1
print('even') if a % 2 == 0 else print('odd')
# odd
Vastab järgmisele koodile, mis on kirjutatud tavalise if-avaldusega.
a = 1
if a % 2 == 0:
print('even')
else:
print('odd')
# odd
Mitut tingimusavaldust saab ka liita, kasutades loogilisi operaatoreid (ja, või jne).
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 ...Ühe rea kirjeldus
if ... elif ... else ...
Selle kirjutamiseks ühele reale ei ole mingit erilist viisi. Küll aga saab seda realiseerida, kasutades väljendis teist kolmikoperaatorit, mida hinnatakse, kui kolmikoperaatori tingimusavaldis on vale. Kujutis ternaarse operaatori pesitsemisest.
Siiski võib olla parem, kui seda ei kasutata laialdaselt, sest see vähendab loetavust.
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
Järgnevat tingimusavaldust võib tõlgendada kahel viisil, kuid seda käsitletakse esimesel viisil (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
Konkreetne näide on järgmine. Esimest väljendit käsitletakse nii, nagu oleks see teine.
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
Loetelu koondnomenklatuuri ja kolmikoperatsioonide kombineerimine
Ternaarne operaator on kasulik kasutada loetelude töötlemisel loetelude mõistes.
Kombineerides ternaarse operaatori ja loendi mõistmise notatsiooni, on võimalik asendada loendi elemente või teostada mõnda muud töötlemist sõltuvalt tingimustest.
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]
Lisateavet nimekirja mõistmise märkimise kohta leiate järgmisest artiklist.
Anonüümsete funktsioonide (lambda-avalduste) ja kolmikoperaatorite kombineerimine
Kasulik on ternaarne operaator, mida saab lühidalt kirjeldada isegi anonüümses funktsioonis (lambda-avalduses).
get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'
print(get_odd_even(1))
# odd
print(get_odd_even(2))
# even
Pange tähele, et kuigi see ei ole seotud ternaarse operaatoriga, omistab ülaltoodud näide lambda-avaldusele nime. Seetõttu võivad automaatsed kontrollivahendid, nagu Pythoni kodeerimiskonventsioon PEP8, genereerida hoiatuse.
Selle põhjuseks on see, et PEP8 soovitab funktsioonidele nimede määramisel kasutada def-i.
PEP8 kontseptsioon on järgmine
- Lambda-avaldusi kasutatakse näiteks kutsutavate objektide üleandmiseks argumentidena, ilma neid nimetamata
- Lambda-avaldustes kasutage def, et defineerida nime järgi