Lambda和Python中的多个语句

时间:2015-02-10 10:44:49

标签: python lambda

有人可以解释lambda函数的行为吗?

import sys
X = lambda: sys.stdout.write('first');sys.stdout.write("second")
X()

返回: - > secondfirst

还有一个问题:

lambda: sys.stdout.write("...");sys.exit(0) 

lambda: sys.exit(0);sys.stdout.write("...")

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

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

4 个答案:

答案 0 :(得分:11)

sys.stdout.write(“second”)不是lambda的一部分。

即使您不拨打X,也始终打印

'秒'。 换句话说,调用X只打印'first'。

您的代码可以改写为;

import sys
X = lambda: sys.stdout.write('first')
sys.stdout.write("second")
print X()

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

lambda: (sys.stdout.write('first'),sys.stdout.write("second"))

答案 1 :(得分:3)

在线有两个声明,第一个是lambda,只有called已经运行后才会sys.stdout.write("second")X()调用lambda。

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

使用正常功能执行等效操作:

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

x()    

对于您的其他示例,您需要分配lambda然后调用它:

x= lambda: sys.exit(0);sys.stdout.write("...")
x()

使用;并且在一行上有多个语句通常不是pythonic或非常好的主意。

答案 2 :(得分:3)

lambda的语法是:

lambda <args>: <expression>

其中<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]

和另一个:

f = lambda: [None, sys.stdout.write("..."), sys.exit(0)][0]

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

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

答案 3 :(得分:2)

第一个代码转换为:

import sys
X = lambda: sys.stdout.write('first')
sys.stdout.write("second")
X()

正如您所看到的,现在second已经first显示了{{1}}。