Pisanje if naredbi u jednom redu s Pythonovim ternarnim operatorom (uvjetni operator)

Poslovanje

Python ima stil pisanja koji se zove ternarni operatori (uvjetni operatori) koji mogu opisati proces poput if naredbe u jednom retku.

Ovdje je objašnjeno sljedeće, zajedno s uzorkom koda.

  • Osnovno pisanje ternarnih operatora
  • if ... elif ... else ...Opišite ovo u jednom retku
  • Kombiniranje sveobuhvatne notacije popisa i ternarnih operatora
  • Kombinacija anonimnih funkcija (lambda izraza) i ternarnih operatora

Pogledajte sljedeći članak za više informacija o normalnom if naredbi.

Osnovno pisanje ternarnih operatora

U Pythonu se ternarni operator može napisati na sljedeći način

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

Ako želite mijenjati vrijednosti prema uvjetima, jednostavno napišite svaku vrijednost onakvu kakva jest.

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

Ako želite promijeniti obradu prema uvjetima, opišite svaki 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

Izrazi koji ne vraćaju vrijednost (izrazi koji vraćaju None) također su prihvatljivi. Ovisno o uvjetu, jedan od izraza se evaluira i proces se izvršava.

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

Ekvivalentno sljedećem kodu napisanom normalnom if naredbom.

a = 1

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

Više uvjetnih izraza također se može povezati pomoću logičkih operatora (i, ili, 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 ...Opis u jednom retku

if ... elif ... else ...Ne postoji poseban način da se to napiše u jednom retku. Međutim, može se realizirati korištenjem drugog ternarnog operatora u izrazu koji se evaluira kada je uvjetni izraz ternarnog operatora netočan. Slika ugniježđenih ternarnih operatora.

Međutim, možda bi bilo najbolje da ga ne koristite intenzivno jer smanjuje čitljivost.

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

Sljedeći uvjetni izraz može se tumačiti na sljedeća dva načina, ali se tretira kao prvi (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 

Konkretan primjer je sljedeći. Prvi izraz se smatra kao da je drugi.

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 sveobuhvatne notacije popisa i ternarnih operatora

Korisna upotreba ternarnog operatora je kada obrađujete popise u zapisu za razumijevanje popisa.

Kombiniranjem ternarnog operatora i zapisa razumijevanja popisa moguće je zamijeniti elemente popisa ili izvršiti neku drugu obradu ovisno o uvjetima.

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 više informacija o zapisu za razumijevanje popisa pogledajte sljedeći članak.

Kombinacija anonimnih funkcija (lambda izraza) i ternarnih operatora

Ternarni operator, koji se može sažeto opisati čak i u anonimnoj funkciji (lambda izraz), je koristan.

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

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Imajte na umu da, iako nije povezan s ternarnim operatorom, gornji primjer dodjeljuje ime lambda izrazu. Stoga alati za automatsku provjeru kao što je Pythonova konvencija o kodiranju PEP8 mogu generirati upozorenje.

To je zato što PEP8 preporučuje korištenje def pri dodjeljivanju imena funkcijama.

Koncept PEP8 je sljedeći

  • Lambda izrazi se koriste za prosljeđivanje objekata koji se mogu pozivati ​​kao argumenata, na primjer, bez imenovanja
  • U lambda izrazima koristite def za definiranje imenom