有人可以解释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
答案 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}}。