2012-10-03 16 views
20

Estaba escribiendo algunas funciones lambda y no pude resolver esto. ¿Hay alguna manera de tener algo como lambda x: x if (x<3) en python? Como lambda a,b: a if (a > b) else b funciona bien. Hasta ahora, lambda x: x < 3 and x or None parece ser lo más cercano que he encontrado.Python lambda con if pero sin más

Respuesta

36

Una lambda, como cualquier función, debe tener un valor de retorno.

lambda x: x if (x<3) no funciona porque no especifica qué devolver si no es x<3. Por defecto funciones devuelven None, por lo que podría hacer

lambda x: x if (x<3) else None 

Pero quizás lo que busca es una lista por comprensión con una condición if. Por ejemplo:

In [21]: data = [1, 2, 5, 10, -1] 

In [22]: [x for x in data if x < 3] 
Out[22]: [1, 2, -1] 
+0

@ ubuntu - gracias. No estoy seguro de por qué asumí que debería devolver None sin especificarlo. – root

+3

Esa es una suposición razonable ya que las funciones devuelven None por defecto. Lo importante a recordar es que lo que sigue a 'lambda x:' debe ser una * expresión *, no una declaración. – unutbu

+3

@root A veces me resulta útil pensar en un 'lambda' como si realmente estuviera escrito como' def lambda (x, y): return ... ' –

6

¿Qué pasa con lambda x: x if x < 3 else None?

+0

mi entendimiento es que la lista por comprensión es más apropiado en este escenario – zinking

+0

La cuestión no menciona iteración, así que no estoy seguro de lo que quiere decir. ¿Puedes elaborar? – user4815162342

+0

u derecha, es solo una suposición probablemente. -_- – zinking

1

siempre puede intentar invocar 'filtro' para los controles condicionales. Fundamentalmente, map() tiene que trabajar en cada aparición de los iterables, por lo que no puede elegir. Pero el filtro puede ayudar a reducir las opciones. Por ejemplo, creo una lista del 1 al 19, pero quiero crear una tupla de cuadrados de solo números pares.

x = list(range(1,20)) 

y = tuple(map(lambda n: n**2, filter(lambda n: n%2==0,x))) 

print (y)