lambda参数解包错误

Ale*_*xei 8 python lambda tuples unpack python-3.x

在Python 2中,这段代码没问题:

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

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

print(map(f, zip(m, k)))
Run Code Online (Sandbox Code Playgroud)

但是在Python 3中发生了以下错误:

f = lambda (m, k): m + k
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

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

TypeError: <lambda>() missing 1 required positional argument: 'k'
Run Code Online (Sandbox Code Playgroud)

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

f = lambda args: args[0] + args[1]
Run Code Online (Sandbox Code Playgroud)

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

Ash*_*ary 8

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

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


t.y*_*t.y 8

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

lambda mk: (lambda m,k: m + k)(*mk)
Run Code Online (Sandbox Code Playgroud)

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

  • 非常好,虽然有点复杂(顺便说一句,它是“pythonic”的同义词吗?)。这种方法将轻松赢得超过 2 元组的胜利!指数**很**糟糕。想想看:`lambda abcdef: abcdef[0] + abcdef[2] - abcdef[1] // abcdef[4]`? (2认同)

vic*_*vic 7

PEP 3113中讨论了元组拆包的删除.基本上,你不能在Python 3中做到这一点.在标题转换计划下,你会看到这样做的"建议"方式是你的最终代码块:

lambda x_y: x_y[0] + x_y[1]
Run Code Online (Sandbox Code Playgroud)