2011-10-24 30 views
52

tengo el siguiente códigouna línea si la condición de asignación

num1 = 10 
someBoolValue = True 

necesito para establecer el valor de num1-20 si someBoolValue es True; y no hagas nada de lo contrario. Así pues, aquí está mi código para que

num1 = 20 if someBoolValue else num1 

Se notaba que podía evitar la parte ...else num1 para que se vea más limpia? Un equivalente a

if someBoolValue: 
    num1 = 20 

que intentó reemplazarlo con ...else pass así: num1=20 if someBoolValue else pass. Todo lo que obtuve fue un error de sintaxis. Tampoco podría omitir la parte ...else num1.

Gracias

+1

acaba de cambiar todo a 'num1 = 20 si someBoolValue demás 10'. ¿Entonces guardas la línea 'num1 = 10' también? –

+0

Gracias. Pero este no es exactamente mi código. Quise decir que 'num1' ya existe ... – bdhar

Respuesta

87

no creo que esto es posible en Python, ya que lo que en realidad estás tratando de hacer, probablemente se expandió a algo como esto:

num1 = 20 if someBoolValue else num1 

Si se excluye else num1, recibirá un error de sintaxis ya que estoy seguro de que la asignación debe estar efectivamente RETU algo.

Como otros ya han mencionado, se puede hacer esto, pero es malo porque es probable que acaba de terminar confundiendo a sí mismo al leer ese trozo de código que la próxima vez:

if someBoolValue: num1=20 

yo no soy una gran fan del num1 = someBoolValue and 20 or num1 por el mismo motivo. Tengo que pensar dos veces en lo que está haciendo esa línea.

La mejor manera de lograr realmente lo que quiere hacer es la versión original:

if someBoolValue: 
    num1 = 20 

La razón de que es la mejor verison es porque es muy obvio lo que quiere hacer, y no se confundirá usted mismo o quien quiera que entre en contacto con ese código más adelante.

Además, como nota al margen, num1 = 20 if someBoolValue es código de Ruby válido, porque Ruby funciona de manera diferente.

+2

Gracias Martin, por las explicaciones !! – bdhar

+1

Según PEP-308 (https://docs.python.org/2.5/whatsnew/pep-308.html), la expresión condicional se puede aclarar si se coloca en paren, como en 'num1 = (20 si someBoolValue else num1) '. – haridsv

13

En una línea:

if someBoolValue: num1 = 20 

Pero no hagas eso. Este estilo normalmente no se espera. La gente prefiere la forma más larga para mayor claridad y consistencia.

if someBoolValue: 
    num1 = 20 

(Igualmente, tapas de camello debe ser evitado. Así que en lugar utilizar some_bool_value.)

Tenga en cuenta que un filtro en línea expresiónsome_value if predicate sin una parte else no existe porque no habría un retorno valor si el predicado era falso. Sin embargo, las expresiones deben tener un valor de retorno claramente definido en todos los casos. Esto es diferente del uso que en, por ejemplo, Ruby o Perl.

+0

¿por qué no debería hacer eso? – bdhar

+2

Se agregó aclaración. – Debilski

+2

Porque es difícil de leer y es probable que termines confundido por tu propio código, y eso nunca es una buena idea. – Frost

3

No. Supongo que esperaba que algo como num1 = 20 if someBoolValue funcionara, pero no es así. Creo que la mejor forma de hacerlo es con la declaración if como lo ha escrito:

if someBoolValue: 
    num1 = 20 
24

Utilice esta:

num1 = 20 if someBoolValue else num1 
+1

esto es lo que he estado usando ... y buscando un sustituto ... ¡gracias de todos modos! – bdhar

0
num1 = 20 * someBoolValue or num1 
6

puede utilizar uno de los siguientes:

(falseVal, trueVal)[TEST] 

TEST and trueVal or falseVal 
+0

Niza una asignación condicional del trazador de líneas – minhas23

3
num1 = 10 + 10*(someBoolValue == True) 

Esa es mi nueva respuesta final. La respuesta anterior fue la siguiente y fue excesivo para el problema establecido. Getting_too_clever == not Good. Aquí está la respuesta antes ... sigue siendo bueno si quieres añadir una cosa para True cond y otro para False:

num1 = 10 + (0,10)[someBoolValue == True] 

Usted ha mencionado num1 ya tendría un valor que se debe dejar solos. Supuse num1 = 10 ya que esa es la primera afirmación de la publicación, por lo que la operación para llegar a 20 es agregar 10.

num1 = 10 
someBoolValue = True 

num1 = 10 + (0,10)[someBoolValue == True] 

print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}') 

produce esta salida

num1 = 20 
someBoolValue = True 
+0

Ahora estoy pensando que debería haber respondido 'num1 = 10 + 10 * (someBoolValue == True)' Problema definido como la condición 'Falsa' básicamente como no operativa. Si necesita ser una opción para agregar un valor diferente para 'False', entonces la respuesta anterior es una mejor opción. ¿Edito mi publicación o hago esto en los comentarios? – MikeyB

Cuestiones relacionadas