lambda 参数解包错误

Posted

技术标签:

【中文标题】lambda 参数解包错误【英文标题】:lambda arguments unpack error 【发布时间】:2015-03-02 18:49:00 【问题描述】:

在 Python 2 中,这段代码是可以的:

f = lambda (m, k): m + k

m = [1,2,3,4]
k = [5,6,7,8]

print(map(f, zip(m, k)))

但在 Python 3 中出现以下错误:

f = lambda (m, k): m + k
^
SyntaxError: invalid syntax

如果我删除 lambda 表达式中的括号,则会发生另一个错误:

TypeError: <lambda>() missing 1 required positional argument: 'k'

在 Python 3 中也可以使用元组作为单个 lambda 参数,但不清楚(难以阅读):

f = lambda args: args[0] + args[1]

如何在 Python 3 中以正确的方式解包值?

【问题讨论】:

map()f 应用于提供的可迭代对象的每个元素;在您给定的示例中,map() 尝试将 (1, 5) 传递到您的函数中,该函数接受两个参数,但只提供了一个参数,因此它失败并给您错误。 他们从函数中删除了它,以便与类型提示(以及其他)很好地配合使用。另请参阅我的回答:***.com/a/54991720/1338797 【参考方案1】:

在PEP 3113 中讨论了元组解包的删除。基本上,您不能在 Python 3 中执行此操作。在标题 Transition plan 下,您会看到“建议”的执行方式是您的最终代码块:

lambda x_y: x_y[0] + x_y[1]

【讨论】:

【参考方案2】:

如果您使用 itertools.starmap 而不是 map 为我们解包元组项,则可以在 Python 2 和 Python 3 中使用相同的语法:

>>> from itertools import starmap
>>> f = lambda m, k: m + k
>>> list(starmap(f, zip(m, k)))
[6, 8, 10, 12]

【讨论】:

【参考方案3】:

您可能会发现此解决方案更易于阅读:

lambda mk: (lambda m,k: m + k)(*mk)

此外,我认为解包使这更加 (1) Pythonic 和 (2) 与 named 函数的元组参数的手动解包一致,PEP 3113 在 Python 3 中要求.

【讨论】:

非常好,虽然有点复杂(顺便说一句,它是“pythonic”的同义词吗?)。这种方法将赢得超过 2 元组的胜利!指数不好。想想看:lambda abcdef: abcdef[0] + abcdef[2] - abcdef[1] // abcdef[4]?【参考方案4】:

您不能在 Python3 中使用括号来解压 lambda 函数 (PEP 3113) 中的参数,请尝试:

f = lambda m, k: m + k

要使其与您的代码一起使用,您应该使用:

lambda mk: mk[0] + mk[1]

【讨论】:

它可以与 map(f, zip(m, k)) 一起使用吗?至于(我已经写过)发生了 TypeError。 @Alexei 那你应该试试lambda mk: mk[0] + mk[1]。在发布答案之前,我没有查看您的其余代码:) 感谢您的关注。我认为这是 Python 进化过程中的一些奇怪决定……【参考方案5】:

或者您可以直接 sum() 来添加数字而无需解包:

f = lambda args: sum(args)

【讨论】:

感谢您的回答 =) 但这只是一个简单的例子。在我的 lambda 中真的更复杂。此外,我认为可以使用 sum 函数而无需包装在 lambda 中。【参考方案6】:

随便用

map(f, m, k)

注意f可以是

from operator import add
map(add, m, k)

【讨论】:

以上是关于lambda 参数解包错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥解包元组会导致语法错误?

VS2010 中的 C++ 嵌套 lambda 错误,带有 lambda 参数捕获?

std::function 和 lambda 参数的分段错误

类型错误:<lambda>() 缺少 1 个必需的位置参数:'w'

GridsearchCV:尝试在参数中传递 lambda 时无法腌制函数错误

为啥这个 Java lambda 表达式参数有错误?