任何人都可以解释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)
的语法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 函数的目的,即做一些简短而非常简单的事情。
我想这在您的具体示例中仍然可以,但看起来有点像黑客。
网上有两个语句,第一个是在 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 风格,也不是一个非常好的主意。