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])))()
Ver el() al final? La lambda interna no se devuelve, se llama.
la función hace el equivalente de
def swap(a, x, y):
a[x] = (a[x], a[y])
a[y] = a[x][0]
a[x] = a[x][1]
Pero supongamos que queremos hacer esto de una lambda. No podemos usar asignaciones en un lambda. Sin embargo, podemos llamar al __setitem__
para obtener el mismo efecto.
def swap(a, x, y):
a.__setitem__(x, (a[x], a[y]))
a.__setitem__(y, a[x][0])
a.__setitem__(x, a[x][1])
Pero para una lambda, solo podemos tener una expresión. Pero ya que estas son las llamadas a funciones que podemos envolverlos en una tupla
def swap(a, x, y):
(a.__setitem__(x, (a[x], a[y])),
a.__setitem__(y, a[x][0]),
a.__setitem__(x, a[x][1]))
Sin embargo, todos esos __setitem__
's me están consiguiendo abajo, así que vamos a factorizar a cabo:
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, que pueda ¡No salgas con la tarea de agregar otra tarea! Sé que vamos a abusar de los parámetros predeterminados.
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()
Ok vamos a cambiar a 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]))()
Lo que nos lleva de nuevo a la expresión original (más/menos errores tipográficos)
Todo esto lleva de nuevo a la pregunta: ¿Por qué?
La función debería haberse aplicado como
def swap(a, x, y):
a[x],a[y] = a[y],a[x]
El autor original fue salir de su manera de utilizar una lambda en lugar de una función. Podría ser que, por alguna razón, no le gusta la función anidada. No lo sé. Todo lo que diré es su código malo. (a menos que haya una misteriosa justificación para ello)
buscar y mostrar una ejemplo real; ese no es sintácticamente correcto. –
produce SyntaxError: sintaxis no válida. No tiene sentido second lambda – joaquin
¿Por qué alguien haría esto? Respuesta: ¿Irritar a los demás? – joaquin