在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中以正确的方式解压缩值?
答案 0 :(得分:6)
PEP 3113中讨论了删除元组解包的问题。基本上,您不能在Python 3中执行此操作。在标题 Transition plan 下,您会看到执行此操作的“建议”方式是最终代码块:
lambda x_y: x_y[0] + x_y[1]
答案 1 :(得分:6)
如果您使用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]
答案 2 :(得分:3)
您不能在Python3中使用括号来解压缩lambda函数中的参数(PEP 3113),请尝试:
f = lambda m, k: m + k
要使其与您的代码一起使用,您应该使用:
lambda mk: mk[0] + mk[1]
答案 3 :(得分:3)
您可能会发现此解决方案更易于阅读:
lambda mk: (lambda m,k: m + k)(*mk)
此外,我认为解包使得更多(1)Pythonic和(2)与命名函数的元组参数的手动解包一致,在Python 3中需要{ {3}}
答案 4 :(得分:0)
或者你只需要sum()来添加数字而无需解压缩:
f = lambda args: sum(args)
答案 5 :(得分:0)
只需使用
map(f, m, k)
请注意,f
可以是
from operator import add
map(add, m, k)