为什么在lambda中无法打印?


163

为什么不起作用?

lambda: print "x"

这不是一个单一的陈述,还是其他?该文档对于lambda允许的内容似乎有点稀疏...


1
docs.python.org/reference/expressions.html#lambda。它说“表达式”,它是所有可能表达式的完整定义的链接。这个“稀疏”如何?什么不正确或不完整?
S.Lott

3
@Lott我对什么表达/陈述以及印刷品的归属有误解。现在变得有意义
Anycorn

Answers:


187

一个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

5
现在,我了解了使其功能如此之大的原因。想要使用print作为默认的kwarg并对此进行了修复。谢谢。
Thomas Dignan

1
我可以知道为什么from __future__ import print_function必须在代码开头吗?THX

我在哪里可以看到我们在这里写的印刷品?
Sk。Irfan '18

我同意Ben的评论:我没有得到这个建议。Python(2或3)具有print()内置方法。
ivanleoncz

27

在我将其用于简单存根的​​情况下,请使用以下方法:

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

完美地运作。


3
另外请注意-使用上方的。仅在不可用的地方使用它-这将是当前严重过时的版本。
Danny Staple

24

你写的等同于

def anon():
    return print "x"

这也会导致SyntaxError,python不允许您分配要在2.xx中打印的值;在python3中,你可以说

lambda: print('hi')

这样做是可行的,因为他们将print更改为函数而不是语句。


3
还有from __future__ import print_function,可以在py2.x中启用此功能
tzaman 2010年

5
或可替换地lambda: sys.stdout.write('hi')
FMARK

@fmark:除非在2.x中不是那么简单:您需要处理sys.stdout.softspace,然后(至少)之后写换行符。
弗雷德·纽克

11

Lambda的主体必须是一个返回值的表达式。 print作为语句,不会返回任何东西,甚至也不返回None。同样,您不能将的结果分配给print变量:

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

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

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

11

你可以做这样的事情。

创建一个函数以将打印语句转换为函数:

def printf(text):
   print text

并打印:

lambda: printf("Testing")

更灵活:def printf(fmt, *args): print(fmt % args)
IvyMike

4

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

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

假设您的“非工具化” lambda为:

lambda: 4

然后,您的“工具化” lambda为:

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

3

Lambda的主体必须是单个表达式print是一个声明,很遗憾,它已经退出了。


谢谢,我不确定表达与陈述的定义,现在说得通了
Anycorn 2010年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.