Betrachten Sie den folgenden Python2-Code
In [5]: points = [ (1,2), (2,3)]
In [6]: min(points, key=lambda (x, y): (x*x + y*y))
Out[6]: (1, 2)
Dies wird in Python3 nicht unterstützt und ich muss Folgendes tun:
>>> min(points, key=lambda p: p[0]*p[0] + p[1]*p[1])
(1, 2)
Das ist sehr hässlich. Wenn das Lambda eine Funktion wäre, könnte ich es tun
def some_name_to_think_of(p):
x, y = p
return x*x + y*y
Durch das Entfernen dieser Funktion in Python3 wird der Code gezwungen, entweder die hässliche Methode (mit magischen Indizes) auszuführen oder unnötige Funktionen zu erstellen (am störendsten ist es, sich gute Namen für diese unnötigen Funktionen auszudenken).
Ich denke, die Funktion sollte zumindest nur Lambdas hinzugefügt werden. Gibt es eine gute Alternative?
Update: Ich verwende den folgenden Helfer, um die Idee in der Antwort zu erweitern
def star(f):
return lambda args: f(*args)
min(points, key=star(lambda x,y: (x*x + y*y))
Update2: Eine sauberere Version fürstar
import functools
def star(f):
@functools.wraps(f):
def f_inner(args):
return f(*args)
return f_inner
lambda
im gleichen Geist wie er widersetzt map
, reduce
und filter
.
lambda
wurde für die Entfernung in py3k geplant, da es im Grunde eine Plage für die Sprache ist. Aber niemand konnte sich auf eine geeignete Alternative für die Definition anonymer Funktionen einigen, also warf Guido schließlich niedergeschlagen die Arme hoch und das war's.
map
und filter
am besten durch Verständnis ersetzt werden, mag ich reduce
)
lambda
, dass Sie vollständig aus der Sprache entfernt werden, als Änderungen rückgängig zu machen, die die Verwendung erschwert haben. Sie können jedoch versuchen, auf Python-Ideen zu posten, wenn Sie den Wunsch äußern möchten, die Funktion wieder hinzuzufügen.