¿Por qué no se imprime el trabajo en un lambda?

¿Por qué no funciona esto?

lambda: print "x" 

¿No es esto una sola statement, o es otra cosa? La documentación parece un poco escasa sobre lo que se permite en un lambda …

El cuerpo de una lambda tiene que ser una sola expresión . En Python 2.x, print es una statement. Sin embargo, en Python 3, print es una función (y una aplicación de función es una expresión, por lo que funcionará en un lambda). Puede (y debe, para compatibilidad hacia adelante 🙂 usar la función de impresión con puerto trasero si está utilizando la última versión de Python 2.x:

 In [1324]: from __future__ import print_function In [1325]: f = lambda x: print(x) In [1326]: f("HI") HI 

lo que has escrito es equivalente a

 def anon(): return print "x" 

que también da como resultado un error de syntax, python no le permite asignar un valor para imprimir en 2.xx; en python3 se podría decir

 lambda: print('hi') 

y funcionaría porque han cambiado la impresión para ser una función en lugar de una statement.

En los casos en los que estoy usando esto para un simple aplastamiento, uso esto:

 fn = lambda x: sys.stdout.write(str(x) + "\n") 

que funciona perfectamente

El cuerpo de un lambda tiene que ser una expresión que devuelve un valor. print , al ser una statement, no devuelve nada, ni siquiera None . Del mismo modo, no puede asignar el resultado de print a una variable:

 >>> x = print "hello" File "", line 1 x = print "hello" ^ SyntaxError: invalid syntax 

Tampoco puedes poner una asignación de variable en un lambda, ya que las asignaciones son declaraciones:

 >>> lambda y: (x = y) File "", line 1 lambda y: (x = y) ^ SyntaxError: invalid syntax 

Puedes hacer algo como esto.

Cree una función para transformar la statement de impresión en una función:

 def printf(text): print text 

E imprímelo:

 lambda: printf("Testing") 

El cuerpo de un lambda tiene que ser una sola expresión . print es una statement, por lo que está fuera, por desgracia.

Con Python 3.x, la impresión CAN puede funcionar en un lambda, sin cambiar la semántica de la lambda.

Utilizado de una manera especial, esto es muy útil para la depuración. Publico esta ‘respuesta tardía’, porque es un truco práctico que uso a menudo.

Supongamos que su lambda ‘no instruida’ es:

 lambda: 4 

Entonces su lambda ‘instrumentada’ es:

 lambda: (print (3), 4) [1] 

Aquí , usted ve una respuesta para su pregunta. print no es expresión en Python, dice.