¿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 ...
¿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 ...
Respuestas:
El lambda
cuerpo de A tiene que ser una sola expresión . En Python 2.x, print
es una declaració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). 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
from __future__ import print_function
debe estar al principio del código? thx
print()
como método incorporado.
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
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.
from __future__ import print_function
, que habilita esto en py2.x
lambda: sys.stdout.write('hi')
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 print
a 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
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")
def printf(fmt, *args): print(fmt % args)
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]