2009-10-18 7 views
189

En pitón 2.6, quiero hacer:¿Hay una manera de llevar a cabo "si" en lambda del pitón

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, de ser así, cómo hacerlo?

gracias

+1

No se puede imprimir o subir en una lambda. Lambdas son solo funciones, siempre puedes usar una función. –

+10

No estoy de acuerdo con usted. Necesito 4 funciones diferentes, 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 entradas simples, antes de la iteración, puedo reducirla a solo 4 líneas de código de inicio. Mientras menos, mejor ... – Guy

+5

4 líneas de código no es una solución loable cuando otras personas tienen que leer, interpretar, entender y mantener el código.Además, el problema de "imprimir/elevar" en el ejemplo muestra esto que no puede y no debe hacerse en lambdas. –

Respuesta

398

La sintaxis que está buscando:

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

Pero no se puede utilizar o printraise en una lambda.

+21

en python 3, puede usar print – recursive

+37

f = lambda x: x% 2 == 0 también funcionaría. – unutbu

+8

Claro, pero la pregunta era "¿cómo uso' if' en una lambda? " no "¿cuál es la mejor manera de escribir una lambda que devuelve verdadero si un número es par?" –

13

Lambdas en Python son bastante restrictivas con respecto a lo que está permitido el uso. Específicamente, no puede tener ninguna palabra clave (excepto operadores como and, not, or, etc.) en su cuerpo.

Por lo tanto, no hay manera de que usted podría utilizar un lambda por su ejemplo (porque no se puede utilizar raise), pero si usted está dispuesto a conceder eso ... que puede usar:

f = lambda x: x == 2 and x or None 
+9

La restricción específica de lambda es que no está permitido usar declaraciones, solo expresiones. –

29

qué no solo defines una función?

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

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

+3

'print' aún no tiene una función en 2.6. :) –

+6

@ Lukáš Lalinský: todavía funciona en 2.x. se tratará como un par de paréntesis redundantes – newacct

+17

No conoce su caso de uso real, por lo que no hay manera de que pueda decir que no hay ninguna razón para usar un lambda. –

19

Puede lanzar fácilmente una excepción en una lambda, si eso es lo que realmente desea 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 error informando de lambdas; deje que tenga un valor de 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 else z" es peor, solo asegúrate de no estar intentando meter demasiado en un cuerpo lambda.

+1

Elevarlo en una persona que llama es probablemente el método más bonito si me preguntas. –

+0

Posiblemente, pero depende en gran medida del caso particular. Por supuesto, también puedes decorar la lambda después de crearla. 'x = RaiseValueErrorOnNone (x)', nuevamente, dependiendo del caso. –

21

Probablemente la línea pitón peor que he escrito hasta ahora:

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

Si x == 2 imprimir,

si x = 2 se eleva!.

3

Nota Puede utilizar varios otra cosa ... si declaraciones en su definición lambda:

f = lambda x: 1 if x>0 else 0 if x ==0 else -1 
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 
Cuestiones relacionadas