example - python lambda aws
¿Hay una manera de realizar "si" en lambda de python (10)
¿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.
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 un if
en lambda
y, en caso afirmativo, cómo hacerlo?
Gracias
La sintaxis que estás buscando:
lambda x: True if x % 2 == 0 else False
Pero no puedes usar print
o raise
en una lambda.
Lambdas en Python es bastante restrictivo con respecto a lo que puedes usar. Específicamente, no puede tener palabras clave (excepto los operadores como and
, not
, or
, etc.) en su cuerpo.
Entonces, no hay forma de que puedas usar un lambda para tu ejemplo (porque no puedes usar el raise
), pero si estás dispuesto a conceder eso ... Podrías usar:
f = lambda x: x == 2 and x or None
Lo que necesitas exactamente es
def fun():
raise Exception()
f = lambda x:print x if x==2 else fun()
ahora llama a la función de la manera que necesites
f(2)
f(3)
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 imprimes,
Si x! = 2 subes.
Puede crear fácilmente una excepción en un 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 errores fuera de las lambdas; deje que tenga un valor de Ninguno y genere el error en la persona que llama. No creo que esto sea intrínsecamente malo, aunque considero que la sintaxis "y if x else z" es peor en sí misma. Solo asegúrate de que no estés tratando de meter demasiado en un cuerpo lambda.
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
Siguiente código de ejemplo funciona para mí. No estoy seguro de 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)))
También puedes usar operadores lógicos para tener algo como un condicional
func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse
Puedes ver más sobre los operadores lógicos here
tenga en cuenta que puede usar varios más ... si hay declaraciones en su definición lambda:
f = lambda x: 1 if x>0 else 0 if x ==0 else -1