swap = lambda a,x,y:(lambda f=a.__setitem__:(f(x,(a[x],a[y])),
f(y,a[x][0]),f(x,a[x][1])))()
看到()在最后?内部的lambda不被返回,它被调用。
功能做的
def swap(a, x, y):
a[x] = (a[x], a[y])
a[y] = a[x][0]
a[x] = a[x][1]
相当于但是让我们假设我们想这样做的拉姆达。我们不能在lambda中使用任务。不过,我们可以拨打__setitem__
来达到同样的效果。
def swap(a, x, y):
a.__setitem__(x, (a[x], a[y]))
a.__setitem__(y, a[x][0])
a.__setitem__(x, a[x][1])
但是对于lambda,我们只能有一个表达式。但是,由于这些函数调用我们可以在一个元组包裹起来
def swap(a, x, y):
(a.__setitem__(x, (a[x], a[y])),
a.__setitem__(y, a[x][0]),
a.__setitem__(x, a[x][1]))
然而,所有这些__setitem__
的是让我下来,让我们将它们剔除:
def swap(a, x, y):
f = a.__setitem__
(f(x, (a[x], a[y])),
f(y, a[x][0]),
f(x, a[x][1]))
Dagnamit,我可以不要放弃增加另一项任务!我知道让我们滥用默认参数。
def swap(a, x, y):
def inner(f = a.__setitem__):
(f(x, (a[x], a[y])),
f(y, a[x][0]),
f(x, a[x][1]))
inner()
好吧,让我们切换到lambda表达式:
swap = lambda a, x, y: lambda f = a.__setitem__: (f(x, (a[x], a[y])), f(y, a[x][0]), f(x, a[x][1]))()
让我们回到原来的表达(加/减错别字)
所有这一切都导致回到刚才的问题:为什么?
功能应该被实现为
def swap(a, x, y):
a[x],a[y] = a[y],a[x]
原作者去摆脱他的使用lambda而不是一个函数的方式。可能是因为某些原因他不喜欢嵌套函数。我不知道。我要说的是它的糟糕的代码。 (除非有一个神秘的理由)。
查找并显示出真实的例子;那一个在语法上不正确。 – 2010-12-06 00:12:02
产生SyntaxError:无效的语法。没有意义第二lambda – joaquin 2010-12-06 00:13:14
为什么有人会这样做?答:为了刺激他人? – joaquin 2010-12-06 00:16:24