Python ha un operatore condizionale ternario?

Se Python non ha un operatore condizionale ternario, è possibile simularne uno usando altri costrutti del linguaggio?

Soluzione

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 "", 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:

  • L'ordine degli argomenti è diverso da quello del classico operatore ternario 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).
  • Alcuni lo trovano "ingombrante", poiché va contro il normale flusso di pensiero (pensare prima alla condizione e poi agli effetti).
  • Ragioni stilistiche. (Anche se l''inline 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:

Commentari (10)

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.

  1. [Esiste un equivalente dell'operatore ternario "?:" del C?
Commentari (4)

Da la documentazione:

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.

Commentari (0)