2010-06-22 44 views
67

C y muchos otros idiomas tienen un operador conditional (aka ternary). Esto le permite tomar decisiones muy escuetas entre dos valores en función de la verdad de una condición, lo que hace que las expresiones, incluidas las asignaciones, sean muy concisas.python? (condicional/ternario) operador para las asignaciones

echo esto porque me parece que mi código tiene un montón de asignaciones condicionales que tienen cuatro líneas en Python:

if condition: 
    var = something 
else: 
    var = something_else 

Mientras que en C que sería:

var = condition? something: something_else; 

Una o dos veces en un archivo está bien, pero si tienes muchas asignaciones condicionales, el número de líneas explota y, lo peor de todo, el ojo se ve atraído por ellas.

Me gusta la concisión del operador condicional porque mantiene las cosas que considero no estratégicas que me distraen al rozar el código.

Entonces, en Python, ¿hay algún truco que pueda usar para obtener la asignación en una sola línea para aproximar las ventajas del operador condicional como las describí?

Respuesta

128

Python tiene un operador como:

variable = something if condition else something_else 

Alternativamente, aunque no se recomienda (ver @ comentario de Karadoc):

variable = (condition and something) or something_else 
+8

Esa "variable = condición y algo o algo_ello" ni siquiera funciona. Por ejemplo, "True and False or True" devuelve True, mientras que "True? False: True" devolverá False. – karadoc

+0

Something or Something_else funciona bien, ¿verdad? Por ejemplo, si algo era nulo, ¿lo configuraría para something_else? – Breedly

12

En el código Python antiguo, es posible ver el truco:

condition and something or something_else 

sin embargo, esto ha sido reemplazado por el enormemente superior ... if ... else ... constructo:

something if condition else something_else 
+0

¿Por qué no "trabajas si no es lo que sea" funciona? – Will

+4

@Will: Porque "return if not whatever" no es sintácticamente correcto Python? –

+0

@Will Probablemente porque no proporciona una parte 'else'? – glglgl

Cuestiones relacionadas