Python中的Lambda和多个语句

2024-04-28 03:58:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

返回: ->;第二名

还有一个问题:

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

或者

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

无法正确执行。 还有一个问题,为什么在第一个primer中执行流程是从右向左的?

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


Tags: lambda函数importgtlinuxstdoutsysexit
3条回答

在线上有两个语句,第一个是在lambda中,该语句只在sys.stdout.write("second")已经运行之后才得到calledX()调用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或非常好的主意。

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函数的目的,即做一些简短而真正简单的事情。

我想在你的具体例子中还是可以的,但是看起来有点像黑客。

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

“second”总是打印出来,即使你不打电话给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"))

相关问题 更多 >