为什么不在lambda打印工作?

为什么这不工作?

lambda: print "x" 

这不是一个单一的陈述,还是其他的东西? 文档似乎有点稀疏,什么是允许的lambda …

lambda的身体必须是一个单一的expression 。 在Python 2.x中, print是一个声明。 但是,在Python 3中, print是一个函数 (函数应用程序是一个expression式,所以它可以在lambda中运行)。 如果您使用最新的Python 2.x,您可以(也应该为了向前兼容:)使用后端口打印function:

 In [1324]: from __future__ import print_function In [1325]: f = lambda x: print(x) In [1326]: f("HI") HI 

你写的是相当于

 def anon(): return print "x" 

这也导致了一个SyntaxError,python不让你指定一个值在2.xx中打印; 在Python3中,你可以说

 lambda: print('hi') 

它会工作,因为他们已经改变了印刷成为一个function,而不是一个声明。

在我使用这个简单残段的情况下,我使用这个:

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

这完美的作品。

lambda的主体必须是返回值的expression式。 print ,作为一个声明,不返回任何东西,甚至None 。 同样,您不能将print结果分配给一个variables:

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

你也不能在lambda中放置一个variables赋值,因为赋值是语句:

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

你可以做这样的事情。

创build一个将print语句转换为函数的函数:

 def printf(text): print text 

并打印出来:

 lambda: printf("Testing") 

拉姆达的身体必须是一个单一的expressionprint是一个声明,所以不幸的是,

在这里 ,你看到你的问题的答案。 print不是Python中的expression式,它说。

使用Python 3.x,print CAN可以在lambda中工作,而不会改变lambda的语义。

以特殊的方式使用,这对于debugging非常方便。 我张贴这个“迟到的答案”,因为这是我经常使用的一个实用的技巧。

假设你的“uninstrumented”的lambda是:

 lambda: 4 

那么你的“仪器化”lambda是:

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