Python的lambda函数不接受元组参数。

91

我正在运行带有PyDev v2.6插件的Eclipse SDK v3.6,分别在Linux和Windows上的两台PC上。

我想将元组作为参数传递,例如:

foo = lambda (x,y): (y,x)
print (foo((1,2)))

这在Linux上有效并给出了正确的结果:

> (2,1)

在Windows上会出现错误:

foo = lambda (x,y): (y,x)
             ^
SyntaxError: invalid syntax

如何解决这个问题?


真的吗?我在 Windows 机器上运行正常。 - Jon Clements
两者使用相同的Python版本吗? - bruno desthuilliers
7
我发现,在Python 3.0版本中,元组参数已经被弃用。更确切地说,是元组参数的“解包”被移除了。并且它不是在3.0版本中被弃用--而是在3.0版本中被移除了。 - newacct
5
解决方案有误。正确的应该是 lambda q:(q[0],q[1]) in states(interjay也是这样描述的)。 - jogojapan
2
如果你只是在做你第一个代码片段中展示的内容,那就使用 def。如果你将 lambda 应用于元组的可迭代对象上,itertoolsstarmap 会自动为你解包,例如:starmap(lambda x, y: x + y, ((1, 2), (3, 4), (5, 6))) # => (3, 7, 11) - tristanslater
1个回答

177

你可能在Windows上运行Python 3.x,在Linux上运行Python 2.x。在Python 3中,解压元组参数的功能已经被删除,请参见PEP 3113

您可以手动解压元组,这将适用于Python 2.x和3.x:

foo = lambda xy: (xy[1],xy[0])

或者:

def foo(xy):
    x,y = xy
    return (y,x)

7
或者 foo = lambda x, y: (y, x) -> foo(*(1,2))(在Py3上运行,我不知道在Py2上是否有效...) 将匿名函数foo定义为一个接受两个参数xy并返回它们的元组(y, x)。然后使用*(1, 2)这个参数元组去调用它,并返回(2, 1)。请注意,这段代码在Python 3中可以正常工作,但我不确定它是否适用于Python 2。 - gecco
35
谢谢您的提问。有人知道如何使用函数式编程的方式将元组参数转换为两个独立的参数,以增强可读性吗? - Joel Cross
47
这太丑陋了。我永远会对Python有好感,但这简直太糟糕了。 - damd
3
我也认为Python需要改进这个。超级丑。 - Bamdad Dashtban
3
有人知道一个漂亮的函数式编程方法,将元组参数转换为两个单独的参数,以增强可读性吗? 很抱歉回答晚了五年... 你要找的函数叫做curry! Curry接受一对值作为函数的参数,并返回一个带有2个参数的函数。还有curry3,它将一个3元组函数转换成一个带有3个参数的函数,以此类推。 https://hoogle.haskell.org/?hoogle=curry 在动态类型的语言中,比如Python,我们通常可以定义autoCurry,它将任何N元组函数转换成一个具有N个参数的函数。 - bagrounds
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接