¿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 ...

Cualquier maíz
fuente
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
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
fuente
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

Danny Staple
fuente
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.

dagoof
fuente
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
Paul Kuliniewicz
fuente
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")
Victor C. Martins
fuente
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]
Jacques de Hooge
fuente
3

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

tzaman
fuente
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.

vpit3833
fuente
1
Respuesta incompleta, pero buen enlace.
Stephen