Declaración condicional en una línea de la función lambda en python?

Disculpas si esto se ha pedido antes, pero no pude verlo en ninguna parte.

Esencialmente, me he encontrado con un escenario en el que necesito hacer uso de una sentencia if dentro de una función lambda. Lo que lo hace difícil es que, idealmente, debe estar en una sola línea de código (si eso es posible)

Normalmente, escribiría esto:

T = 250 if (T > 200): rate = 200*exp(-T) else: rate = 400*exp(-T) return (rate) 

Sin embargo, necesito que se vea así:

 rate = lambda(T) : if (T>200): return(200*exp(-T)); else: return(400*exp(-T)) 

Me doy cuenta de que lo más fácil sería tomar la decisión fuera de las funciones lambda y luego tener una función lambda separada para cada caso, pero no es realmente adecuada aquí. Las funciones lambda se almacenan en una matriz y se accede a ellas cuando es necesario, con cada elemento de la matriz correspondiente a una “tasa” particular, por lo que tener dos filas separadas para la misma “tasa” podría desordenar las cosas. Cualquier ayuda sería muy apreciada, o si no es posible, una confirmación de otros sería agradable 🙂

Utilice la exp1 if cond else exp2 .

 rate = lambda T: 200*exp(-T) if T>200 else 400*exp(-T) 

Tenga en cuenta que no utiliza el return en expresiones lambda.

La forma correcta de hacer esto es simple:

 def rate(T): if (T > 200): return 200*exp(-T) else: return 400*exp(-T) 

No hay ninguna ventaja en usar lambda aquí. Lo único por lo que vale lambda es permitirte crear funciones anónimas y usarlas en una expresión (a diferencia de una statement). Si asigna inmediatamente la lambda a una variable, ya no es anónima y se usa en una statement, por lo que solo hace que su código sea menos legible sin razón.

La función de rate definida de esta manera se puede almacenar en una matriz, pasar, llamar, etc. exactamente de la misma manera que podría hacerlo una función lambda. Será exactamente igual (excepto un poco más fácil de depurar, introspección, etc.).


De un comentario:

Bueno, la función necesitaba encajar en una línea, ¿qué no pensé que pudieras hacer con una función nombrada?

No puedo imaginar ninguna buena razón por la que la función deba encajar en una sola línea. Pero claro, puedes hacer eso con una función nombrada. Intenta esto en tu intérprete:

 >>> def foo(x): return x + 1 

Además, estas funciones se almacenan como cadenas que luego se evalúan utilizando “eval”, por lo que no estaba seguro de cómo hacerlo con las funciones normales.

Nuevamente, aunque es difícil estar 100% seguro sin tener idea de por qué hace esto, al menos estoy 99% seguro de que no tiene una razón o una mala razón para ello. Casi siempre que crees que quieres pasar las funciones de Python como cadenas y eval para que puedas usarlas, en realidad solo quieres pasar las funciones de Python como funciones y usarlas como funciones.

Pero en caso de que esto sea realmente lo que necesita aquí: simplemente use exec lugar de eval .

No mencionaste qué versión de Python estás usando. En 3.x, la función exec tiene exactamente la misma firma que la función eval :

 exec(my_function_string, my_globals, my_locals) 

En 2.7, exec es una statement, no una función, pero aún puede escribirla con la misma syntax que en 3.x (siempre que no intente asignar el valor de retorno a nada) y funciona.

En la versión 2.x anterior (antes de 2.6, ¿creo?) Tienes que hacerlo así:

 exec my_function_string in my_globals, my_locals 

Sí, puedes usar la syntax abreviada de las sentencias if .

 rate = lambda(t): (200 * exp(-t)) if t > 200 else (400 * exp(-t)) 

Tenga en cuenta que tampoco utiliza declaraciones de return explícitas en lambda s.

Encontré que PODÍA usar declaraciones “si-entonces” en un lambda. Por ejemplo:

 eval_op = { '|' : lambda x,y: eval(y) if (eval(x)==0) else eval(x), '&' : lambda x,y: 0 if (eval(x)==0) else eval(y), '<' : lambda x,y: 1 if (eval(x)' : lambda x,y: 1 if (eval(x)>eval(y)) else 0, } 

En el momento en que dices rate = lambda whatever... que rate = lambda whatever... ya has vencido el punto de lambda y deberías definir una función. Pero, si quieres un lambda, puedes usar ‘y’ y ‘o’

 lambda(T): (T>200) and (200*exp(-T)) or (400*exp(-T))