Lambda和Python中的多个语句

use*_*992 6 python lambda

任何人都可以解释lambda的行为吗?

import sys
X = lambda: sys.stdout.write('first');sys.stdout.write("second")
X()
Run Code Online (Sandbox Code Playgroud)

返回: - > secondfirst

还有一个问题:

lambda: sys.stdout.write("...");sys.exit(0) 
Run Code Online (Sandbox Code Playgroud)

要么

lambda: sys.exit(0);sys.stdout.write("...")
Run Code Online (Sandbox Code Playgroud)

无法正确执行.还有一个问题,为什么在第一个引物执行流程从右到左?

试用:Python3 +(3.4,3.2)操作系统:Linux(Ubuntu),OSX

owi*_*ebo 12

sys.stdout.write("second")不是lambda的一部分.

即使你不打电话给X,也总是打印'秒'.换句话说,调用X只打印'first'.

您的代码可以重写为;

import sys
X = lambda: sys.stdout.write('first')
sys.stdout.write("second")
print X()
Run Code Online (Sandbox Code Playgroud)

如果你想要lambda执行的两个语句将它们放在一个元组中;

lambda: (sys.stdout.write('first'),sys.stdout.write("second"))
Run Code Online (Sandbox Code Playgroud)


ffe*_*rri 6

的语法lambda是:

lambda <args>: <expression>
Run Code Online (Sandbox Code Playgroud)

where<expression>必须是单个表达式。它不能是一个语句、多个语句或多个由 分隔的表达式;

在您的代码中发生的事情是lambda具有更高的优先级;,因此被解析为:X = lambda: sys.stdout.write('first')其次是sys.stdout.write("second")。在周围添加括号sys.stdout.write('first') ; sys.stdout.write("second")不起作用并产生语法错误。

我在 lambda 中做多件事的技巧是:

f = lambda: [None, sys.stdout.write('first'), sys.stdout.write("second")][0]
Run Code Online (Sandbox Code Playgroud)

另一个:

f = lambda: [None, sys.stdout.write("..."), sys.exit(0)][0]
Run Code Online (Sandbox Code Playgroud)

然而,这种方式违背了 lambda 函数的目的,即做一些简短而非常简单的事情。

我想这在您的具体示例中仍然可以,但看起来有点像黑客。


Pad*_*ham 3

网上有两个语句,第一个是在 a 中lambda,只有在已经运行called之后才得到。调用 lambda。sys.stdout.write("second")X()

所以它不会从右到左,我们只有一个仅在下一行被调用的 lambda。这与定义函数、写入 sys.stdout 然后调用该函数没有什么不同。

用普通函数做等价的事情:

sys.stdout.write("second") 
def x():
    sys.stdout.write('first')

x()    
Run Code Online (Sandbox Code Playgroud)

对于另一个示例,您需要分配 lambda,然后调用它:

x= lambda: sys.exit(0);sys.stdout.write("...")
x()
Run Code Online (Sandbox Code Playgroud)

通常,使用 a;并在一行上包含多个语句并不是 Python 风格,也不是一个非常好的主意。