为什么不打印lambda?

Any*_*orn 154 python printing lambda python-2.x

为什么这不起作用?

lambda: print "x"
Run Code Online (Sandbox Code Playgroud)

这不是一个单一的陈述,还是别的什么?关于lambda中允许的内容,文档似乎有点稀疏......

L̲̳*_*̲̳̳ 181

一个lambda人的身体必须是单一的表达.在Python 2.x中,print是一个声明.但是,在Python 3中,print是一个函数(函数应用程序是一个表达式,因此它将在lambda中工作).如果您使用的是最新的Python 2.x,则可以(并且应该为了向前兼容性:)使用后端打印功能:

In [1324]: from __future__ import print_function

In [1325]: f = lambda x: print(x)

In [1326]: f("HI")
HI
Run Code Online (Sandbox Code Playgroud)

  • 现在我明白为什么让它成为一个功能是如此重要.想要使用print作为默认的kwarg并修复它.谢谢. (5认同)

Dan*_*ple 26

如果我使用它来进行简单的剔除,我会使用:

fn = lambda x: sys.stdout.write(str(x) + "\n")
Run Code Online (Sandbox Code Playgroud)

哪作得很好.

  • 作为补充说明 - 使用上面的未来.只在没有的地方使用它 - 这将是一个严重过时的版本. (3认同)

dag*_*oof 24

你所写的相当于

def anon():
    return print "x"
Run Code Online (Sandbox Code Playgroud)

这也导致了一个SyntaxError,python不允许你在2.xx中分配一个打印值; 你可以说在python3中

lambda: print('hi')
Run Code Online (Sandbox Code Playgroud)

它会工作,因为他们已经将print更改为函数而不是语句.

  • 或者``lambda:sys.stdout.write('hi')` (5认同)
  • 还有`from __future__ import print_function`,它在py2.x中启用它 (3认同)

Pau*_*icz 11

lambda的主体必须是一个返回值的表达式. print作为一种陈述,不会返回任何东西,甚至不会None.同样,您无法将结果分配给print变量:

>>> x = print "hello"
  File "<stdin>", line 1
    x = print "hello"
            ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

您也不能在lambda中放置变量赋值,因为赋值是语句:

>>> lambda y: (x = y)
  File "<stdin>", line 1
    lambda y: (x = y)
                 ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)


Vic*_*ins 11

你可以做这样的事情.

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

def printf(text):
   print text
Run Code Online (Sandbox Code Playgroud)

并打印出来:

lambda: printf("Testing")
Run Code Online (Sandbox Code Playgroud)

  • 更灵活:`def printf(fmt, *args): print(fmt % args)` (2认同)

Jac*_*oge 7

在 Python 3.x 中, print 可以在 lambda 中工作,而无需更改 lambda 的语义。

以特殊方式使用,这对于调试非常方便。我发布这个“迟到的答案”,因为这是我经常使用的实用技巧。

假设你的“未检测”的 lambda 是:

lambda: 4
Run Code Online (Sandbox Code Playgroud)

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

lambda: (print (3), 4) [1]
Run Code Online (Sandbox Code Playgroud)