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没有返回,它被称为。在
函数的作用相当于
^{pr2}$
但是我们假设我们要在一个lambda里做这个。我们不能在lambda中使用赋值。{cd1>然而,我们可以称之为相同的效果。在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]))
达纳米特,我不能再增加一个任务!我知道让我们滥用默认参数。在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()
好,我们换到lambdas: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而不是函数。可能是因为某种原因他不喜欢嵌套函数。我不知道。我要说的是它的坏代码。(除非有一个神秘的理由。)