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[x], a[y])
a[y] = a[x][0]
a[x] = a[x][1]
しかし、ラムダでこれを行いたいとしましょう。ラムダでは割り当てを使用できません。ただし、__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])
しかし、ラムダの場合、式は 1 つしか持てません。しかし、これらは関数呼び出しなので、タプルにまとめることができます
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__
's は私を失望させているので、それらを因数分解しましょう。
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()
では、ラムダに切り替えましょう。
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]
元の作成者は、関数ではなくラムダを使用するために道を踏み外しました。なんらかの理由で、ネストされた関数が気に入らない可能性があります。知らない。私が言うのは、その悪いコードです。(不可解な理由がある場合を除きます。)