Skriva if-utsagor på en rad med Pythons ternära operatör (villkorlig operatör)

Företag

Python har en skrivstil som kallas ternära operatörer (villkorliga operatörer) som kan beskriva en process som ett if-uttalande på en enda rad.

Följande förklaras här, tillsammans med exempelkod.

  • Grundläggande skrivning av ternära operatörer
  • if ... elif ... else ...Beskriv detta på en rad
  • Kombinerande lista Utförlig notation och ternära operatörer
  • Kombination av anonyma funktioner (lambdauttryck) och ternära operatörer

I följande artikel finns mer information om det normala if-kommandot.

Grundläggande skrivning av ternära operatörer

I Python kan den ternära operatören skrivas på följande sätt

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

Om du vill byta värden beroende på omständigheterna skriver du helt enkelt varje värde som det är.

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

Om du vill växla behandling beroende på förhållanden ska du beskriva varje uttryck.

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

Uttryck som inte returnerar något värde (uttryck som returnerar None) är också godtagbara. Beroende på villkoret utvärderas ett av uttrycken och processen utförs.

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

Det motsvarar följande kod som är skriven med en normal if-angivelse.

a = 1

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

Flera villkorliga uttryck kan också sammanfogas med hjälp av logiska operatörer (och, eller osv.).

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 ...Beskrivning på en rad

if ... elif ... else ...Det finns inget särskilt sätt att skriva detta på en enda rad. Det kan dock förverkligas genom att använda en annan ternär operatör i uttrycket som utvärderas när det villkorliga uttrycket i den ternära operatören är falskt. Bild av nesting ternary operators.

Det kan dock vara bäst att inte använda det i stor utsträckning eftersom det försämrar läsbarheten.

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

Följande villkorliga uttryck kan tolkas på följande två sätt, men behandlas som det förstnämnda (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 

Ett konkret exempel är följande. Det första uttrycket betraktas som om det vore det andra.

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

Kombinerande lista Utförlig notation och ternära operatörer

En användbar användning av den ternära operatorn är när du bearbetar listor i listförståelse-notationen.

Genom att kombinera den ternära operatören och listförståelsen är det möjligt att ersätta element i en lista eller utföra någon annan behandling beroende på villkoren.

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]

Mer information om listförståelse finns i följande artikel.

Kombination av anonyma funktioner (lambdauttryck) och ternära operatörer

Den ternära operatören, som kan beskrivas kortfattat även i en anonym funktion (lambdauttryck), är användbar.

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

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Observera att även om det inte är relaterat till den ternära operatören, tilldelar ovanstående exempel ett namn till lambdauttrycket. Därför kan automatiska kontrollverktyg som Pythons kodningskonvention PEP8 generera en varning.

Detta beror på att PEP8 rekommenderar att man använder def när man tilldelar namn till funktioner.

Konceptet för PEP8 är följande

  • Lambdauttryck används för att skicka anropsbara objekt som argument, till exempel utan att namnge dem.
  • I lambdauttryck använder du def för att definiera med namn.