在Python 3中,使用分号在一行中定义lambda函数。

4
在Python3中,以下示例可行:
print(3); print(5)

然而,以下代码由于分号的问题会导致语法错误:
(lambda key: (print(3); print(5)))

为什么会这样,有没有一种方法可以在单行中编写lambda函数(我的意图是将其作为短参数传递,而无需在其他地方定义该函数)?

2
我怀疑这是一个 XY 问题,但没有更多的上下文很难确定... - Chris_Rands
4
你可以直接使用def,这会使代码更易读。你不必非得在别处定义它,如果需要的话,可以使用一个嵌套的def - Jonathan Sudiaman
1
有点脏(但也许用于调试还可以)min(lst, key=lambda x: print(x) or x[1]) - Chris_Rands
你为什么要使用lambda来打印()? - Code-Apprentice
@Code-Apprentice 我正在将lambda函数作为min函数的关键字参数传递,并且我只是想确认一下key参数是否是我所认为的。所以这与我正在处理的代码无关,只是想看看它是什么,并知道为什么;在lambda函数中不能正常工作。 - ozgeneral
显示剩余3条评论
3个回答

5
现有的答案涵盖了问题的“如何?”方面,但没有涉及“为什么?”。也就是说,为什么lambda: print(3); print(5)不能工作?答案在语言规范中。
来自https://docs.python.org/3/reference/expressions.html#lambda
Lambda表达式(有时称为lambda形式)用于创建匿名函数。表达式lambda arguments: expression生成一个函数对象。[...]请注意,使用lambda表达式创建的函数不能包含语句或注释。
来自https://docs.python.org/3/reference/simple_stmts.html?highlight=semicolon#simple-statements
简单语句包含在单个逻辑行内。几个简单语句可以在单个行上以分号分隔出现。

print(3); print(5) 包含分号,因此它是一组简单语句。但是 lambda 表达式不能包含语句。因此,lambda 表达式不能包含 print(3); print(5)


因此,为什么(lambda key: (print(3), print(5)))可以工作?这是因为(print(3), print(5))不是语句,而是一个表达式:特别地,它是一个元组字面值(正式地说,是一种带有括号的形式,其表达式列表包含至少一个逗号),其第一个元素是使用参数3调用print调用,其第二个元素是使用参数5调用print。所有这些都是单个表达式,所以lambda可以轻松接受它。

-1

另一个可能的选择:

f = lambda x, y: print(x, y, sep='\n')
f(3, 4)

# 3
# 4

好奇,在我的电脑上help(print)会显示print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) - Kevin

-1

您可以创建一个lambda函数并在一行中使用它,但不需要分号。

在括号中定义lambda,并立即使用括号传递参数:

(lambda x,y: x+y)(6,4)

这将输出10。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接