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])))()
Siehe die() am Ende? Das innere Lambda wird nicht zurückgegeben, es wird aufgerufen.
Die Funktion tut das Äquivalent von
def swap(a, x, y):
a[x] = (a[x], a[y])
a[y] = a[x][0]
a[x] = a[x][1]
Aber nehmen wir an, dass wir dies in einem Lambda tun wollen. Wir können keine Zuweisungen in einem Lambda verwenden. Wir können jedoch __setitem__
für den gleichen Effekt aufrufen.
def swap(a, x, y):
a.__setitem__(x, (a[x], a[y]))
a.__setitem__(y, a[x][0])
a.__setitem__(x, a[x][1])
Aber für ein Lambda können wir nur einen Ausdruck haben. Aber da diese Funktionsaufrufe sind, können wir sie in einem Tupel einpacken
def swap(a, x, y):
(a.__setitem__(x, (a[x], a[y])),
a.__setitem__(y, a[x][0]),
a.__setitem__(x, a[x][1]))
jedoch all diese __setitem__
‚s mir sind immer nach unten, so lasst sie ausklammern:
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, kann ich Geh nicht mit dem Hinzufügen einer anderen Aufgabe! Ich weiß, lass uns Standardparameter missbrauchen.
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 wir über lambdas wechseln:
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]))()
Was uns wieder auf den ursprünglichen Ausdruck bringt (plus/minus Tippfehler)
All dies führt zu der Frage zurück: Warum?
Die Funktion sollte als
def swap(a, x, y):
a[x],a[y] = a[y],a[x]
Der ursprüngliche Autor ging Art und Weise aus dem Weg umgesetzt wurden eher eine Lambda zu verwenden, um eine Funktion. Es könnte sein, dass er aus irgendeinem Grund die verschachtelte Funktion nicht mag. Ich weiß es nicht. Alles, was ich sagen werde, ist sein schlechter Code. (es sei denn, es gibt eine mysteriöse Begründung dafür.)
finden und zeigen echtes Beispiel; das ist nicht syntaktisch korrekt. –
erzeugt SyntaxError: ungültige Syntax. Kein Sinn zweites Lambda – joaquin
Warum sollte jemand das tun? Antwort: Andere irritieren? – joaquin