Scrivere istruzioni if in una riga con l’operatore ternario di Python (operatore condizionale)

Attività commerciale

Python ha uno stile di scrittura chiamato operatori ternari (operatori condizionali) che possono descrivere un processo come un'istruzione if in una singola linea.

Ciò che segue è spiegato qui, insieme al codice di esempio.

  • Scrittura di base degli operatori ternari
  • if ... elif ... else ...Descrivere questo in una riga
  • Combinando la notazione completa della lista e gli operatori ternari
  • Combinazione di funzioni anonime (espressioni lambda) e operatori ternari

Vedi il seguente articolo per maggiori informazioni sulla normale istruzione if.

Scrittura di base degli operatori ternari

In Python, l'operatore ternario può essere scritto come segue

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

Se volete cambiare i valori in base alle condizioni, scrivete semplicemente ogni valore così com'è.

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

Se vuoi cambiare l'elaborazione in base alle condizioni, descrivi ogni espressione.

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

Anche le espressioni che non restituiscono un valore (espressioni che restituiscono None) sono accettabili. A seconda della condizione, una delle espressioni viene valutata e il processo viene eseguito.

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

Equivalente al seguente codice scritto con una normale istruzione if.

a = 1

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

Le espressioni condizionali multiple possono anche essere concatenate usando operatori logici (e, o, ecc.).

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 ...Descrizione di una linea

if ... elif ... else ...Non c'è un modo speciale per scrivere questo su una singola linea. Tuttavia, può essere realizzato usando un altro operatore ternario nell'espressione che viene valutata quando l'espressione condizionale dell'operatore ternario è falsa. Immagine dell'annidamento degli operatori ternari.

Tuttavia, potrebbe essere meglio non usarlo estensivamente perché riduce la leggibilità.

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 seguente espressione condizionale può essere interpretata nei seguenti due modi, ma viene trattata come la prima (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 esempio concreto è il seguente. La prima espressione è considerata come se fosse la seconda.

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

Combinando la notazione completa della lista e gli operatori ternari

Un uso utile dell'operatore ternario è quando si elaborano le liste nella notazione di comprensione delle liste.

Combinando l'operatore ternario e la notazione di comprensione della lista, è possibile sostituire elementi di una lista o eseguire qualche altra elaborazione a seconda delle condizioni.

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 maggiori informazioni sulla notazione di comprensione della lista, vedere il seguente articolo.

Combinazione di funzioni anonime (espressioni lambda) e operatori ternari

L'operatore ternario, che può essere descritto concisamente anche in una funzione anonima (espressione lambda), è utile.

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

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Notate che, sebbene non sia collegato all'operatore ternario, l'esempio precedente assegna un nome all'espressione lambda. Pertanto, gli strumenti di controllo automatico come la convenzione di codifica PEP8 di Python possono generare un Warning.

Questo perché PEP8 raccomanda l'uso di def quando si assegnano nomi alle funzioni.

Il concetto di PEP8 è il seguente

  • Le espressioni lambda sono usate per passare oggetti richiamabili come argomenti, per esempio, senza nominarli
  • Nelle espressioni lambda, usate def per definire per nome
Copied title and URL