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__
«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]))
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()
Хорошо давайте перейдем к лямбды:
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]
оригинальный автор пошел выход из своего пути, чтобы использовать лямбда, а затем функцию. Может быть, он почему-то не любит вложенную функцию. Я не знаю. Все, что я скажу, это его плохой код. (если для этого нет таинственного оправдания).
Найти и показать реальный пример; что он не является синтаксически правильным. – 2010-12-06 00:12:02
создает синтаксис SyntaxError: недопустимый. Нет смысла второй лямбда – joaquin 2010-12-06 00:13:14
Зачем кому-то это делать? Ответ: раздражать других? – joaquin 2010-12-06 00:16:24