¿Hay alguna manera de realizar "si" en la lambda de Python

358

En python 2.6 , quiero hacer:

f = lambda x: if x==2 print x else raise Exception()
f(2) #should print "2"
f(3) #should throw an exception

Esto claramente no es la sintaxis. ¿Es posible realizar una ifen lambday si es así cómo hacerlo?

Gracias

Chico
fuente
2
No se puede imprimir o aumentar en una lambda. Las lambdas son solo funciones, siempre puedes usar una función en su lugar.
Lennart Regebro
10
No estoy de acuerdo contigo. Necesito 4 funciones diferentes y muy cortas, como la anterior, que deben colocarse en una lista / diccionario para poder iterar sobre ellas y seleccionar cuáles usar en cada iteración. En lugar de muchas líneas de código de solo inits, antes de la iteración, puedo reducirlo a solo 4 líneas de código de inicio. Cuanto menos, mejor ...
Guy
55
4 líneas de código no es una solución loable cuando otras personas tienen que leer, interpretar, comprender y mantener el código. Además, el problema de "imprimir / subir" en el ejemplo muestra esto que no puede y no debe hacerse en lambdas.
S.Lott
@LennartRegebro lambdas no son funciones en python, son solo expresiones, es por eso que hay muchas cosas que no puedes hacer con ellas.
Aaron McMillin
1
@AaronMcMillin Lambdas son funciones. Están restringidos a expresiones por razones de sintaxis, pero SON funciones.
Lennart Regebro

Respuestas:

660

La sintaxis que estás buscando:

lambda x: True if x % 2 == 0 else False

Pero no puedes usar printo raiseen una lambda.

Robert Rossney
fuente
33
en python 3, puede usar print
recursivo el
11
Claro, pero la pregunta era "¿Cómo lo uso ifen una lambda?" no "¿cuál es la mejor manera de escribir una lambda que devuelve True si un número es par?"
Robert Rossney
99
Es una sintaxis horrible, fácilmente la peor construcción del lenguaje Python, que se acerca a los niveles de absurdo de Perl en su evaluación fuera de orden, pero es lo que se pidió. ¿Estás rechazando en serio las respuestas por ser correctas?
Glenn Maynard
41
Es la respuesta correcta a la pregunta "¿Cómo escribo una función lambda que me diga si un número es par?" Sin embargo, no es una respuesta correcta a la pregunta que originalmente hizo el OP. Por mucho que no me gusta el ejemplo que he inventado, mi puesto lo hace , de hecho, responde claramente a la pregunta de la OP.
Robert Rossney
10
Es dolorosamente obvio que cualquiera que sugiera "x% 2 == 0", o vote un comentario que lo recomiende, lo que hace al menos a siete personas, ni siquiera leyó la pregunta original.
Glenn Maynard
40

¿Por qué no solo define una función?

def f(x):
    if x == 2:
        print(x)
    else:
        raise ValueError

realmente no hay justificación para usar lambda en este caso.

SilentGhost
fuente
3
printaún no es una función en 2.6. :)
Lukáš Lalinský
77
@ Lukáš Lalinský: todavía funciona en 2.x. será tratado como un par de paréntesis redundantes
newacct
24
No conoce su caso de uso real, por lo que no hay forma de decir que no hay razón para usar una lambda.
Glenn Maynard
66
@Glenn Maynard: Casi no hay razón para usar una lambda, punto. Asignar un lambda a una variable, como sustituto def, generalmente es una muy mala idea (tm). Simplemente use un defprograma que los simples programadores mortales puedan leer, interpretar, comprender y mantener.
S.Lott
17
Hay muchos usos legítimos de lambdas. Si no puedes pensar en ninguno, entonces eso no es culpa de lambda. (No soy un fan de la sintaxis en sí, por supuesto - es una solución torpe por el hecho de que de Python mal concebida muesca sintaxis no puede manejar las funciones en línea como los lenguajes normales.)
Glenn Maynard
25

Probablemente la peor línea de Python que he escrito hasta ahora:

f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])

Si x == 2 imprime,

si x! = 2 subes.

jimifiki
fuente
felicitaciones, creo que esta es la única respuesta en la página que realmente responde a la pregunta
theEpsilon
22

Puede plantear fácilmente una excepción en una lambda, si eso es lo que realmente quiere hacer.

def Raise(exception):
    raise exception
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value"))

¿Es esta una buena idea? Mi instinto en general es dejar el informe de error fuera de lambdas; deje que tenga el valor Ninguno y genere el error en la persona que llama. Sin embargo, no creo que esto sea intrínsecamente malo; considero que la sintaxis "y si x más z" en sí es peor, solo asegúrate de que no estás tratando de meter demasiado en un cuerpo lambda.

Glenn Maynard
fuente
1
Elevarlo en una llamada es probablemente el método más bonito si me preguntas.
Dominic Bou-Samra el
Posiblemente, pero depende en gran medida del caso particular. Por supuesto, también puedes decorar la lambda después de crearla. x = RaiseValueErrorOnNone(x), de nuevo, dependiendo del caso.
Glenn Maynard
15

Las lambdas en Python son bastante restrictivas con respecto a lo que se le permite usar. En concreto, no se puede tener ninguna palabra clave (excepto para los operadores como and, not, or, etc) en su cuerpo.

Por lo tanto, no hay forma de que pueda usar una lambda para su ejemplo (porque no puede usar raise), pero si está dispuesto a aceptar eso ... Podría usar:

f = lambda x: x == 2 and x or None
David Wolever
fuente
16
La restricción específica de lambda es que no puede usar declaraciones, solo expresiones.
Daniel Werner
13

tenga en cuenta que puede usar varios más ... declaraciones if en su definición lambda:

f = lambda x: 1 if x>0 else 0 if x ==0 else -1
filotn
fuente
2

Si aún desea imprimir, puede importar el módulo futuro

from __future__ import print_function

f = lambda x: print(x) if x%2 == 0 else False
Juan pablo lopez
fuente
2

También puede usar operadores lógicos para tener algo como un condicional

func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse

Puede ver más sobre operadores lógicos aquí

Victor lucas
fuente
No va con la filosofía de Python en términos de claridad. Aunque es lógicamente equivalente, la ifsintaxis siempre es preferible a esto. La forma obvia de verificar las condiciones.
0xc0de
¡Gracias! Usé esto en un trabajo de lenguaje funcional en la universidad debido a las restricciones impuestas por el profesor que dice que no podía usar la ifdeclaración, por lo que descubrí que esta no era una manera obvia .
Victor Lucas
2

lo que necesitas exactamente es

def fun():
    raise Exception()
f = lambda x:print x if x==2 else fun()

ahora llame a la función de la manera que necesita

f(2)
f(3)
Manjunath Bhadrannavar
fuente
2

Este fragmento debería ayudarlo a:

x = lambda age: 'Older' if age > 30 else 'Younger'

print(x(40))
Adarsh ​​Somasundar
fuente
0

El siguiente código de muestra me funciona. No estoy seguro si se relaciona directamente con esta pregunta, pero espero que ayude en otros casos.

a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))
Rahul
fuente
0

Intentalo:

is_even = lambda x: True if x % 2 == 0 else False
print(is_even(10))
print(is_even(11))

Fuera:

True
False
Benyamin Jafari
fuente
0

Una manera fácil de realizar un if en lambda es mediante la comprensión de la lista.

No puede generar una excepción en lambda, pero esta es una forma en Python 3.x para hacer algo parecido a su ejemplo:

f = lambda x: print(x) if x==2 else print("exception")

Otro ejemplo:

devuelve 1 si M de lo contrario 0

f = lambda x: 1 if x=="M" else 0
Paul Cysne
fuente