If utasítások írása egy sorban a Python terner operátorával (feltételes operátor)

Üzleti

A Python rendelkezik egy terner operátoroknak (feltételes operátoroknak) nevezett írásmóddal, amely egyetlen sorban képes leírni egy olyan folyamatot, mint egy if utasítás.

A következőket itt magyarázzuk el, mintakóddal együtt.

  • A terner operátorok alapvető írása
  • if ... elif ... else ...Írja le ezt egy sorban
  • Kombináló lista Átfogó jelölés és háromértékű operátorok
  • Névtelen függvények (lambda-kifejezések) és terner operátorok kombinálása

A normál if utasítással kapcsolatos további információkért lásd a következő cikket.

A terner operátorok alapvető írása

Pythonban a terner operátor a következőképpen írható le

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

Ha az értékeket a feltételeknek megfelelően szeretné váltogatni, egyszerűen írja le az egyes értékeket úgy, ahogy vannak.

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

Ha a feldolgozást feltételek szerint szeretné váltani, írja le az egyes kifejezéseket.

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

Az olyan kifejezések, amelyek nem adnak vissza értéket (a None-t visszaadó kifejezések) szintén elfogadhatók. A feltételtől függően az egyik kifejezés kiértékelésre kerül, és a folyamat végrehajtásra kerül.

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

Egyenértékű a következő, normál if utasítással írt kóddal.

a = 1

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

Több feltételes kifejezés is összekapcsolható logikai operátorok (és, vagy stb.) használatával.

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 ...Egysoros leírás

if ... elif ... else ...Nincs különösebb módja annak, hogy ezt egy sorba írjuk. Megvalósítható azonban úgy, hogy egy másik terner operátort használunk a kifejezésben, amely akkor kerül kiértékelésre, ha a terner operátor feltételes kifejezése hamis. A terner operátorok egymásba ágyazásának képe.

A legjobb azonban lehet, ha nem használjuk széles körben, mert csökkenti az olvashatóságot.

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

A következő feltételes kifejezést a következő kétféleképpen lehet értelmezni, de az előbbi (1) szerint kezeljük.

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 

Egy konkrét példa a következő. Az első kifejezést úgy tekintjük, mintha a második lenne.

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

Kombináló lista Átfogó jelölés és háromértékű operátorok

A terner operátor hasznos felhasználási módja a listák feldolgozása a listamegértés jelölésében.

A terner operátor és a listamegértés jelölés kombinálásával lehetőség van egy lista elemeinek cseréjére vagy más, a feltételektől függő feldolgozásra.

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]

A listák megértésének jelölésével kapcsolatos további információkért lásd a következő cikket.

Névtelen függvények (lambda-kifejezések) és terner operátorok kombinálása

Hasznos a terner operátor, amely akár egy névtelen függvényben (lambda kifejezésben) is tömören leírható.

get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Vegyük észre, hogy a fenti példa – bár nem kapcsolódik a terner operátorhoz – nevet rendel a lambda kifejezéshez. Ezért az automatikus ellenőrző eszközök, például a Python PEP8 kódolási konvenciója figyelmeztetést generálhat.

Ennek oka, hogy a PEP8 a def használatát ajánlja a függvények nevének hozzárendelésekor.

A PEP8 koncepciója a következő

  • A lambda-kifejezések arra szolgálnak, hogy hívható objektumokat adjunk át argumentumként, például anélkül, hogy megneveznénk őket.
  • A lambda-kifejezésekben használjuk a def-et a név szerinti definiáláshoz.