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


163

¿Por qué esto no funciona?

lambda: print "x"

¿No es esta una sola declaración, o es algo más? La documentación parece un poco escasa sobre lo que está permitido en una lambda ...


1
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é era incorrecto o incompleto?
S.Lott

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

Respuestas:


187

El lambdacuerpo de A tiene que ser una sola expresión . En Python 2.x, printes una declaración. Sin embargo, en Python 3, printes una función (y una aplicación de función es una expresión, por lo que funcionará en una lambda). Puede (y debe, por compatibilidad con el reenvío :) utilizar la función de impresión con puerto posterior 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

55
Ahora veo por qué fue tan importante hacer que funcione. Quería usar print como un kwarg predeterminado y esto lo solucionó. Gracias.
Thomas Dignan

1
¿Puedo saber por qué from __future__ import print_functiondebe estar al principio del código? thx
Ben

¿Dónde vería las huellas de lo que hemos escrito aquí?
Sk. Irfan

Estoy de acuerdo con el comentario de Ben: no entiendo esta importación. Python (2 o 3) tiene print()como método incorporado.
ivanleoncz

27

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

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

que funciona perfectamente


3
Como nota adicional, use el del futuro anterior. Use esto solo donde no esté disponible, lo que sería una versión muy desactualizada en este momento.
Danny Staple

24

lo que has escrito es equivalente a

def anon():
    return print "x"

que también da como resultado un SyntaxError, 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 print para que sea una función en lugar de una declaración.


3
También hay from __future__ import print_function, que habilita esto en py2.x
tzaman

55
O, alternativamentelambda: sys.stdout.write('hi')
fmark

@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.
Fred Nurk

11

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

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

Tampoco 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

11

Puedes hacer algo como esto.

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

def printf(text):
   print text

E imprimirlo:

lambda: printf("Testing")

Más flexiblemente:def printf(fmt, *args): print(fmt % args)
IvyMike

4

Con Python 3.x, la impresión PUEDE funcionar en una lambda, sin cambiar la semántica de la lambda.

Utilizado de 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 'sin instrumentar' es:

lambda: 4

Entonces su lambda 'instrumentada' es:

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

3

El cuerpo de una lambda tiene que ser una sola expresión . printes una declaración, así que está desafortunadamente.


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

2

Aquí , ves una respuesta a tu pregunta. printno es expresión en Python, dice.


1
Respuesta incompleta, pero buen enlace.
Stephen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.