2009-03-13 11 views
7

Duplicar posibles:
Ternary conditional operator in Python¿Cuál es la mejor manera de reemplazar el operador ternario en Python?

Si tengo algo de código como:

x = foo ? 1 : 2 

Cómo debo traducirlo a Python? ¿Puedo hacer esto?

if foo: 
    x = 1 
else: 
    x = 2 

¿El alcance x quedará fuera del bloque if/then? ¿O tengo que hacer algo como esto?

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

Una forma de reemplazarlo es llamarlo por su nombre correcto. En Python es la "expresión condicional". En C es el "operador condicional". En Java, es el "operador condicional". –

Respuesta

26

Utilice el operador ternario (formalmente conditional expression) en Python 2.5+.

x = 1 if foo else 2 
+0

Solo, por favor llámalo la expresión condicional, ya que eso es lo que es. –

+0

@Adriano Varoli Piazza @ S.Lott agregó eso a la respuesta. ¡Gracias! – phihag

0

Usted podría utilizar algo como:

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

aunque no es muy Pythonic

(las otras opciones están más cerca de C/Perl, pero esto implica más magia tupla)

1

duplicados de this one.

yo uso esto (aunque estoy esperando a alguien a downvote o comentario si no es correcta):

x = foo and 1 or 2 
+0

Eso funciona en este caso, pero puede ser peligroso en general: x = foo y bar o baz producirá baz si foo es verdadero y la barra es falsa, que probablemente no es lo que quieres. – Khoth

+0

ah, lo tengo. Lo he usado por un tiempo, y no estaba muy seguro de por qué no era un método aceptado. Puedo ver eso ahora. – jonstjohn

+0

Este código es bastante frágil. – ncmathsadist

5

El operador ternario mentioned solo están disponibles en Python 2.5. Desde el WeekeePeedeea:

A pesar de que se había retrasado por varios años por desacuerdos sobre la sintaxis, un operador ternario para Python era aprobado como la mejora de Python Propuesta 308 y se añadió a la versión 2.5 en septiembre de 2006

El operador ternario de Python difiere de en el operador común: del orden de sus operandos; la forma general es op1 if condition else op2. Este formulario invita a considerar op1 como el valor normal y op2 como un caso excepcional.

Antes de 2,5, se podría utilizar la sintaxis fea (lambda x:op2,lambda x:op1)[condition]() que también tiene cuidado de expresiones sólo se evalúan que en realidad son necesarios con el fin de prevenir los efectos secundarios .

-1

un buen truco pitón está utilizando este:

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

Se crea una lista de 2 miembros, y el booleano se convierte o bien 0 (falso) o 1 (verdadero), que recoge el elemento correcto. No es muy legible, pero pythony :)

+0

No sería legible, ni pitónico, pero sigue siendo algo que uso todo el tiempo ... si estás haciendo este truco, hazlo como una tupla: (trueFunc, falseFunc) [bool (condición)] –

+0

The Python 2.5 la expresión condicional evaluará solo UNA de las expresiones trueFunc, falseFunc. Esta fórmula evalúa ambos. –

+0

Uso (booleanCondition y [trueFunc] o [falseFunc]) [0]. – ThomasH

2

Todavía estoy usando 2.4 en uno de mis proyectos y me he topado con esto algunas veces. La solución más elegante que he visto de esto es:

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

me gusta esto porque representa una prueba booleana más claro que el uso de una lista con los valores de índice 0 y 1 para obtener su valor de retorno.

+0

"not not foo" sería mejor: listas vacías, ceros y todo lo demás también debería evaluar False. – Andreas

Cuestiones relacionadas