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])))()
Voir les parenthèses() à la fin? Le lambda interne n'est pas retourné, c'est appelé.
La fonction ne soit l'équivalent de
def swap(a, x, y):
a[x] = (a[x], a[y])
a[y] = a[x][0]
a[x] = a[x][1]
Mais supposons que nous voulons faire cela dans un lambda. Nous ne pouvons pas utiliser les affectations dans un lambda. Cependant, nous pouvons appeler __setitem__
pour le même effet.
def swap(a, x, y):
a.__setitem__(x, (a[x], a[y]))
a.__setitem__(y, a[x][0])
a.__setitem__(x, a[x][1])
Mais pour un lambda, nous ne pouvons avoir qu'une seule expression. Mais puisque ce sont les appels de fonction, nous pouvons les envelopper dans un tuple
def swap(a, x, y):
(a.__setitem__(x, (a[x], a[y])),
a.__setitem__(y, a[x][0]),
a.__setitem__(x, a[x][1]))
Cependant, tous ces __setitem__
« s sont me faire vers le bas, alors laissez-les factoriser:
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, je peux pas s'en tirer avec l'ajout d'une autre mission! Je sais que nous allons abuser des paramètres par défaut.
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, nous allons passer à 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]))()
Ce qui nous ramène à l'expression originale (plus/moins les fautes de frappe)
Tout cela ramène à la question: Pourquoi?
La fonction aurait dû être mis en œuvre comme
def swap(a, x, y):
a[x],a[y] = a[y],a[x]
L'auteur original est allé sortir de sa façon d'utiliser un lambda plutôt alors une fonction. Il pourrait être qu'il n'aime pas la fonction imbriquée pour une raison quelconque. Je ne sais pas. Tout ce que je vais dire est son mauvais code. (sauf si il y a une justification mystérieuse pour cela.)
rechercher et afficher un véritable exemple; celui-là n'est pas syntaxiquement correct. –
produit SyntaxError: syntaxe non valide. Aucun sens deuxième lambda – joaquin
Pourquoi quelqu'un ferait-il cela? Réponse: Pour irriter les autres? – joaquin