Als statements in één regel schrijven met Python’s ternaire operator (voorwaardelijke operator)

Bedrijf

Python heeft een schrijfstijl die ternaire operatoren (voorwaardelijke operatoren) heet, die een proces zoals een if statement in een enkele regel kunnen beschrijven.

Het volgende wordt hier uitgelegd, samen met voorbeeldcode.

  • Basis schrijven van ternaire operatoren
  • if ... elif ... else ...Beschrijf dit in één regel
  • Combinatielijst Uitgebreide notatie en ternaire operatoren
  • Combinatie van anonieme functies (lambda-expressies) en ternaire operatoren

Zie het volgende artikel voor meer informatie over de normale if verklaring.

Basis schrijven van ternaire operatoren

In Python kan de ternaire operator als volgt worden geschreven

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

Als u de waarden wilt veranderen naargelang de omstandigheden, schrijft u gewoon elke waarde zoals ze is.

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

Als u de verwerking wilt omschakelen op basis van voorwaarden, beschrijf dan elke uitdrukking.

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

Expressies die geen waarde teruggeven (expressies die Geen teruggeven) zijn ook aanvaardbaar. Afhankelijk van de voorwaarde wordt een van de uitdrukkingen geëvalueerd en wordt het proces uitgevoerd.

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

Equivalent aan de volgende code geschreven met een normaal if statement.

a = 1

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

Meervoudige voorwaardelijke uitdrukkingen kunnen ook aan elkaar worden gekoppeld met behulp van logische operatoren (en, of, enz.).

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 ...Beschrijving in één regel

if ... elif ... else ...Er is geen speciale manier om dit op een enkele regel te schrijven. Het kan echter gerealiseerd worden door een andere ternaire operator te gebruiken in de uitdrukking die geëvalueerd wordt als de voorwaardelijke uitdrukking van de ternaire operator vals is. Afbeelding van het nesten van ternaire operatoren.

Het kan echter beter zijn het niet op grote schaal te gebruiken, omdat het de leesbaarheid vermindert.

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

De volgende voorwaardelijke uitdrukking kan op de volgende twee manieren worden geïnterpreteerd, maar wordt behandeld als de eerste (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 

Een concreet voorbeeld is het volgende. De eerste uitdrukking wordt beschouwd alsof het de tweede was.

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

Combinatielijst Uitgebreide notatie en ternaire operatoren

Een nuttig gebruik van de ternaire operator is bij het verwerken van lijsten in list comprehension notatie.

Door de ternaire operator en de lijstbegripnotatie te combineren, is het mogelijk elementen van een lijst te vervangen of een andere verwerking uit te voeren, afhankelijk van de voorwaarden.

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]

Voor meer informatie over de notatie van lijstbegrip, zie het volgende artikel.

Combinatie van anonieme functies (lambda-expressies) en ternaire operatoren

De ternaire operator, die zelfs in een anonieme functie (lambda-expressie) beknopt kan worden beschreven, is nuttig.

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

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Merk op dat, hoewel het geen verband houdt met de ternaire operator, het bovenstaande voorbeeld een naam toekent aan de lambda expressie. Daarom kunnen hulpmiddelen voor automatische controle, zoals Python's coderingsconventie PEP8, een waarschuwing genereren.

Dit komt omdat PEP8 het gebruik van def aanbeveelt bij het toekennen van namen aan functies.

Het concept van PEP8 is als volgt

  • Lambda expressies worden gebruikt om bijvoorbeeld aanroepbare objecten als argumenten door te geven, zonder ze een naam te geven
  • In lambda expressies, gebruik def om te definiëren met naam
Copied title and URL