lambda参数解包错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lambda参数解包错误相关的知识,希望对你有一定的参考价值。

在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'

使用元组作为单个lambda参数的方法也适用于Python 3,但它不清楚(难以阅读):

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

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

答案

PEP 3113讨论了删除元组拆包的问题。基本上,你不能在Python 3中做到这一点。在标题Transition plan下,你会看到这样做的“建议”方式是你的最终代码块:

lambda x_y: x_y[0] + x_y[1]
另一答案

如果你使用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]
另一答案

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

f = lambda m, k: m + k

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

lambda mk: mk[0] + mk[1]
另一答案

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

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

另外,我认为解包使得更多(1)Pythonic和(2)与PEP 3113在Python 3中需要的命名函数的元组参数的手动解包一致。

另一答案

或者你可以只用sum()来添加数字而不解包:

f = lambda args: sum(args)
另一答案

只是用

map(f, m, k)

请注意,f可以

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

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

解包需要长度的字符串参数:Windows 问题?

IntelliJ:求值lambda表达式在调试时引发编译错误

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

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

与 QPushButton 一起使用时,错误 lambda 缺少 1 个必需的位置参数

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