2010-06-04 14 views
135

¿Por qué esto no funciona?¿Por qué no se imprime el trabajo en una lambda?

lambda: print "x" 

¿No es esta una sola afirmación, o es algo más? La documentación parece un poco escaso en lo que se permite en una lambda ...

+1

http://docs.python.org/reference/expressions.html#lambda . Dice "expresión", que es un enlace a una definición completa de todas las expresiones posibles. ¿Cómo es esto "escaso"? ¿Qué fue incorrecto o incompleto? –

+3

@Lott Tuve un malentendido sobre qué expresión/declaración es y dónde pertenece la impresión. tiene sentido ahora – Anycorn

Respuesta

164

Un lambda ' s cuerpo tiene que ser expresión única. En Python 2.x, print es una afirmación. 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 una lambda). Se puede (y debe, por compatibilidad hacia adelante :) utilizar la función de impresión de back-portado 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 
+5

Ahora veo por qué era tan importante para que sea una función. Quería usar print como un kwarg predeterminado y esto lo solucionó. Gracias. –

23

lo que has escrito es equivalente a

def anon(): 
    return print "x" 

que también se traduce en una SyntaxError, pitón no le permite asignar un valor para imprimir en 2.xx; en python3 podría decir

lambda: print('hi') 

y funcionaría porque han cambiado la impresión para que sea una función en lugar de una declaración.

+3

También hay 'de __future__ import print_function', que habilita esto en py2.x – tzaman

+5

O alternativamente' lambda: sys.stdout.write ('hi') ' – fmark

+0

@fmark: Excepto que no es tan simple en 2. x: necesita manejar sys.stdout.softspace y (al menos) escribir una nueva línea después. –

3

El cuerpo de una lambda tiene que ser una sola expresión . print es una afirmación, por lo que desaparece, desafortunadamente.

+0

gracias, no estaba seguro acerca de la definición de expresión versus declaración, ahora tiene sentido – Anycorn

11

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

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

También no se puede poner una asignación variable en una lambda, ya que las asignaciones son declaraciones:

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

Here, se ve una respuesta para su pregunta. print no es expresión en Python, dice.

+1

Respuesta incompleta, pero buen enlace. – Stephen

22

En los casos en que estoy usando esto por sencilla apagando Yo uso este:

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

que funciona perfectamente.

+3

Como una nota adicional, utilice el futuro de arriba. Úselo solo cuando no esté disponible, lo que sería una versión muy desactualizada en este momento. –

8

Puede hacer algo como esto.

Crear una función de transformar sentencia de impresión en una función:

def printf(text): 
    print text 

e imprimirlo:

lambda: printf("Testing") 
1

Con Python 3.x, impresión funciona en una 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 suelo usar.

Suponga que su lambda 'no instrumentado' es:

lambda: 4 

Luego, su lambda 'con instrumentos' es:

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