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