2012-01-21 6 views
12

Duplicar posible:
Python Ternary Operatorpython (bool)? entonces: sintaxis else?

En algunos lenguajes como Java, C/C++, C#, etc., puede asignar un valor basado en el resultado de una expresión booleana en línea.

Por ejemplo,

return (i < x) ? i : x 

de esto volveré si me < x, de lo contrario volverán x. Me gusta esto porque es mucho más compacto en muchos casos que la sintaxis más larga que sigue.

if (i < x) 
    return i 
else 
    return x 

¿Es posible utilizar esta sintaxis en python y, de ser así, cómo?

Respuesta

10

Puede utilizar (x if cond else y), por ejemplo

>>> x = 0 
>>> y = 1 
>>> print("a" if x < y else "b") 
a 

que trabajará será lambda function también.

3

Sí, es así:

return i if i < x else x 

Se llama el operador condicional en Python.

2

Prueba esto en Python:

return i if i < x else x 

Es exactamente el equivalente a la siguiente expresión en Java, C, C++ C#

return i < x ? i : x; 

Leer más sobre Python de conditional expressions.

2

operador ternario en python.

un si b más c

>>> a=1 
>>> b=2 
>>> a if a<b else b 
1 
>>> a if a>b else b 
2 
2

a if b else c se introdujo la sintaxis en Python 2.5. La mayoría de las personas ya se han actualizado a la versión reciente, pero en el código heredado que pueden encontrar otro enfoque:

some_var = a<b and a or c 

Si alguna vez va a utilizar esta sintaxis recuerde que a No hay que evaluar en Falso.

+1

Creo que se introdujo antes de 2.7 (¿era 2.5?). Funciona con seguridad en 2.6 pero no funciona en 2.4. De todos modos, +1. –

+0

Tienes razón, esa era la versión 2.5. Gracias por la corrección. – real4x

2

A medida que el estado de otras respuestas, la versión de Python para esto es:

i if i < x else x

(por supuesto, para este ejemplo en particular, uno preferiría escribir min(i, x), ya que es más fácil en los ojos)

Sin embargo, esta sintaxis de expresión acaba de estar disponible en Python 2.5 (creo que fue alrededor de 2004). antes de eso, se utilizó el siguiente modismo, pero se debe tener cuidado ya que es propenso a errores:

i < x and i or x - porque el operador lógico "y" realmente evalúa el último valor verdadero de su cadena, por lo tanto, si la expresión era verdadero, i < x and i evalúa a i - y el operador or evalúa el primer valor verdadero en la cadena. En este caso, si i < x fuera falso, también lo sería i< x and i y el primer valor verdadero sería x.

Es fácil ver cómo era propenso a errores esta construcción, ya que si el valor booleano de i sería falso (por ejemplo si i == 0), devolvería x, incluso si i < x es verdadero.

Yo mismo, en aquellos días, utilizado para escribir este constructo en su lugar:

(x, i) [i < x]

La expresión "i < x" ha un valor numérico de " 1 "(verdadero) o" 0 "(falso) y usé esta propiedad para que funcione como un índice de la tupla anterior. El problema con este enfoque era que siempre evaluaría ambas expresiones en la tupla, aunque usaría ony una de esas (si las expresiones donde la función llama a esto podría ser costosa, o incluso conflictiva)