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])
Но для лямбды мы можем иметь только одно выражение.Но так как это вызовы функций, мы можем заключить их в кортеж
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()
Хорошо, давайте переключимся на лямбды:
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]
Первоначальный авторстарался изо всех сил использовать лямбду, а не функцию.Возможно, ему почему-то не нравится вложенная функция.Я не знаю.Все, что я скажу, это его плохой код.(если нет загадочного оправдания для этого.)