Escrivint declaracions if en una línia amb l’operador ternari de Python (operador condicional)

Negocis

Python té un estil d’escriptura anomenat operadors ternaris (operadors condicionals) que poden descriure un procés com una instrucció if en una sola línia.

Aquí s’explica el següent, juntament amb el codi d’exemple.

  • Escriptura bàsica d’operadors ternaris
  • if ... elif ... else ...Descriu-ho en una línia
  • Combinació d’operadors de notació integral de llista i ternaris
  • Combinació de funcions anònimes (expressions lambda) i operadors ternaris

Consulteu l’article següent per obtenir més informació sobre la declaració if normal.

Escriptura bàsica d’operadors ternaris

A Python, l’operador ternari es pot escriure de la següent manera

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

Si voleu canviar els valors segons les condicions, simplement escriviu cada valor tal com és.

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

Si voleu canviar el processament segons les condicions, descriu cada expressió.

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

Les expressions que no retornen cap valor (expressions que no retornen Cap) també són acceptables. En funció de la condició, s’avalua una de les expressions i s’executa el procés.

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

Equivalent al codi següent escrit amb una instrucció if normal.

a = 1

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

També es poden concatenar diverses expressions condicionals mitjançant operadors lògics (i, o, etc.).

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 ...Descripció d’una línia

if ... elif ... else ...No hi ha cap manera especial d’escriure això en una sola línia. Tanmateix, es pot realitzar utilitzant un altre operador ternari en l’expressió que s’avalua quan l’expressió condicional de l’operador ternari és falsa. Imatge d’operadors ternaris nidificants.

No obstant això, pot ser millor no utilitzar-lo àmpliament perquè redueix la llegibilitat.

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

La següent expressió condicional es pot interpretar de les dues maneres següents, però es tracta com la primera (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 

Un exemple concret és el següent. La primera expressió es considera com si fos la segona.

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

Combinació d’operadors de notació integral de llista i ternaris

Un ús útil de l’operador ternari és quan es processen llistes en notació de comprensió de llistes.

En combinar l’operador ternari i la notació de comprensió de la llista, és possible substituir elements d’una llista o realitzar algun altre processament en funció de les condicions.

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]

Per obtenir més informació sobre la notació de comprensió de llistes, consulteu l’article següent.

Combinació de funcions anònimes (expressions lambda) i operadors ternaris

L’operador ternari, que es pot descriure de manera concisa fins i tot en una funció anònima (expressió lambda), és útil.

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

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Tingueu en compte que, tot i que no està relacionat amb l’operador ternari, l’exemple anterior assigna un nom a l’expressió lambda. Per tant, les eines de verificació automàtica com la convenció de codificació PEP8 de Python poden generar un avís.

Això es deu al fet que PEP8 recomana l’ús de def quan s’assignen noms a funcions.

El concepte de PEP8 és el següent

  • Les expressions lambda s’utilitzen per passar objectes invocables com a arguments, per exemple, sense anomenar-los
  • A les expressions lambda, utilitzeu def per definir pel nom