2009-03-13 6 views
7

Eventuali duplicati:
Ternary conditional operator in PythonQual è il modo migliore per sostituire l'operatore ternario in Python?

Se ho qualche codice come:

x = foo ? 1 : 2 

Come dovrei tradurlo a Python? Posso farlo?

if foo: 
    x = 1 
else: 
    x = 2 

x sarà ancora compreso nell'ambito dei blocchi if/then? O devo fare qualcosa di simile?

x = None 
if foo: 
    x = 1 
else: 
    x = 2 
+0

Un modo per sostituirlo è chiamarlo con il nome corretto. In Python è "l'espressione condizionale". In C è "l'operatore condizionale". In Java è "l'operatore condizionale". –

risposta

26

Utilizzare l'operatore ternario (formalmente conditional expression) in Python 2.5+.

x = 1 if foo else 2 
+0

Solo, per favore chiamalo espressione condizionale, dato che è quello che è. –

+0

@Adriano Varoli Piazza @ S.Lott ha aggiunto quello alla risposta. Grazie! – phihag

0

si potrebbe usare qualcosa di simile:

val = float(raw_input("Age: ")) 
status = ("working","retired")[val>65] 
print "You should be",status 

anche se non è molto divinatorio

(le altre opzioni sono più vicini alla C/PERL, ma questo comporta più magico tuple)

1

duplicati di this one.

Io uso questo (anche se sto aspettando che qualcuno downvote o commentare se non è corretto):

x = foo and 1 or 2 
+0

Che funziona in questo caso, ma può essere pericoloso in generale: x = foo e bar o baz produrrà baz se foo è true e bar è false, che probabilmente non è quello che vuoi. – Khoth

+0

ah, capito. L'ho usato per un po 'e non ero sicuro del perché non fosse un metodo accettato. Posso vederlo ora. – jonstjohn

+0

Questo codice è piuttosto fragile. – ncmathsadist

5

l'operatore ternario mentioned è disponibile solo da Python 2.5. Dal WeekeePeedeea:

Anche se era stato ritardato per diversi anni da disaccordi sulla sintassi, un operatore ternario per Python era approvato come Python Enhancement Proposta 308 ed è stato aggiunto il rilascio 2.5 nel settembre 2006

L'operatore ternario di Python differisce da l'operatore comune?: Nell'ordine di suoi operandi; la forma generale è op1 if condition else op2. Questo modulo invita a considerare op1 come normale valore e op2 come caso eccezionale.

Prima 2.5, si potrebbe utilizzare la brutta sintassi (lambda x:op2,lambda x:op1)[condition]() che tiene anche cura di espressioni solo valutare che sono effettivamente necessari per prevenire effetti collaterali.

-1

Un bel trucco pitone sta usando questo:

foo = ["ifFalse","ifTrue"][booleanCondition] 

Si crea una lista 2 membered, e il booleano diventa o 0 (falso) o 1 (vero), che raccoglie il membro corretto. Non molto leggibile, ma pythony :)

+0

Non sarei né leggibile, né pythonic, ma è sempre qualcosa che uso sempre ... se stai facendo questo trucco, fallo come una tupla: (trueFunc, falseFunc) [bool (condizione)] –

+0

The Python 2.5 l'espressione condizionale valuterà solo UNO delle espressioni trueFunc, falseFunc. Questa formula valuta entrambi. –

+0

Utilizzare (booleanCondition e [trueFunc] o [falseFunc]) [0]. – ThomasH

2

Sto ancora utilizzando 2.4 in uno dei miei progetti e ho trovato questo alcune volte. La soluzione più elegante che ho visto per questo è:

x = {True: 1, False: 2}[foo is not None] 

Mi piace questo perché rappresenta un test booleano più chiaro rispetto all'utilizzo di un elenco con i valori di indice 0 e 1 per ottenere il vostro valore di ritorno.

+0

"not not foo" sarebbe meglio - elenchi vuoti, zeri e quant'altro dovrebbe anche valutare su False. – Andreas

Problemi correlati