lambda 参数解包错误

lambda arguments unpack error

在Python2这段代码就可以了:

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

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

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

但是在Python3中出现了以下错误:

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 中以正确的方式解压值?

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

f = lambda m, k: m + k

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

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

PEP 3113. Basically, you can't do this in Python 3. Under the headline Transition plan 中讨论了删除元组解包,您会看到 "suggested" 这样做的方法是您的最终代码块:

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

或者您可以直接使用 sum() 来添加数字而不解包:

f = lambda args: sum(args)

如果您使用 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]

只需使用

map(f, m, k)

注意f可以是

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

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

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

此外,我认为解包使它更 (1) Pythonic 和 (2) 与 named 的元组参数的手动解包一致PEP 3113.

Python 3 中要求的函数