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