Se Python non ha un operatore condizionale ternario, è possibile simularne uno usando altri costrutti del linguaggio?
Sì, è stato aggiunto nella versione 2.5. La sintassi dell'espressione è:
a if condition else b
Prima viene valutata la condizione
, poi esattamente una delle due a
o b
viene valutata e restituita in base al valore booleano della condizione
. Se condizione
viene valutata a Vero
, allora a
viene valutata e restituita ma b
viene ignorata, o altrimenti quando b
viene valutata e restituita ma a
viene ignorata.
Questo permette il cortocircuito perché quando condizione
è vera solo a
viene valutata e b
non viene valutata affatto, ma quando condizione
è falsa solo b
viene valutata e a
non viene valutata affatto.
Per esempio:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Notate che i condizionali sono un'espressione, non un statement. Questo significa che non si possono usare istruzioni di assegnazione o passaggio
o altri istruzioni all'interno di una espressione condizionale:
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
Potete, tuttavia, usare le espressioni condizionali per assegnare una variabile in questo modo:
x = a if True else b
Pensate all'espressione condizionale come al passaggio tra due valori. È molto utile quando si è in una situazione di 'un valore o un altro'altro, ma non fa molto altro.
Se hai bisogno di usare delle dichiarazioni, devi usare un normale if
statement invece di una espressione condizionale.
Tenete presente che è disapprovato da alcuni Pythonisti per diverse ragioni:
condizione ? a : b
di molti altri linguaggi (come C, C++, Go, Perl, Ruby, Java, Javascript, ecc.), il che può portare a bug quando persone non familiari con il comportamento di Python lo usano (potrebbero invertire l'ordine degli argomenti).if
' può essere vero utile, e rendere il tuo script più conciso, complica davvero il tuo codice)Se hai problemi a ricordare l'ordine, ricorda che quando si legge ad alta voce, si dice (quasi) quello che si intende. Per esempio, x = 4 if b > 8 else 9
viene letto ad alta voce come x sarà 4 se b è maggiore di 8 altrimenti 9
.
Documentazione ufficiale:
Esiste un equivalente dell'operatore ternario "?:" del C?][3]
[3]: https://docs.python.org/3.3/faq/programming.html#is-there-an-equivalent-of-c-s-ternary-operator "Esiste un equivalente dell'operatore ternario "?:" di C?
Per le versioni precedenti alla 2.5, c'è il trucco:
[expression] and [on_true] or [on_false]
Può dare risultati sbagliati quando on_true
ha un valore booleano falso;
Anche se ha il vantaggio di valutare le espressioni da sinistra a destra, il che è più chiaro secondo me.
Le espressioni condizionali (a volte chiamate "operatore ternario") hanno la priorità più bassa di tutte le operazioni Python.
L'espressione
x if C else y
valuta prima la condizione, C (non x); se C è vera, x viene valutata e viene restituito il suo valore; altrimenti, y viene valutata e viene restituito il suo valore.Vedi PEP 308 per maggiori dettagli sulle espressioni condizionali.
Nuovo dalla versione 2.5.