¿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 ...
¿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 ...
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
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. –
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.
El cuerpo de una lambda tiene que ser una sola expresión . print
es una afirmación, por lo que desaparece, desafortunadamente.
gracias, no estaba seguro acerca de la definición de expresión versus declaración, ahora tiene sentido – Anycorn
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
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.
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. –
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")
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]
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? –
@Lott Tuve un malentendido sobre qué expresión/declaración es y dónde pertenece la impresión. tiene sentido ahora – Anycorn