Rozważmy następujący kod python2
In [5]: points = [ (1,2), (2,3)]
In [6]: min(points, key=lambda (x, y): (x*x + y*y))
Out[6]: (1, 2)
Nie jest to obsługiwane w python3 i muszę wykonać następujące czynności:
>>> min(points, key=lambda p: p[0]*p[0] + p[1]*p[1])
(1, 2)
To jest bardzo brzydkie. Gdyby lambda była funkcją, mógłbym to zrobić
def some_name_to_think_of(p):
x, y = p
return x*x + y*y
Usunięcie tej funkcji w pythonie3 wymusza na kodzie brzydkie postępowanie (z magicznymi indeksami) lub tworzenie niepotrzebnych funkcji (najbardziej kłopotliwe jest wymyślenie dobrych nazw dla tych niepotrzebnych funkcji)
Myślę, że ta funkcja powinna zostać dodana przynajmniej do samych lambd. Czy jest dobra alternatywa?
Aktualizacja: używam następującego pomocnika rozszerzającego pomysł w odpowiedzi
def star(f):
return lambda args: f(*args)
min(points, key=star(lambda x,y: (x*x + y*y))
Update2: czystsza wersja dlastar
import functools
def star(f):
@functools.wraps(f):
def f_inner(args):
return f(*args)
return f_inner
lambda
jest całkowite usunięcie z języka, a następnie cofnięcie zmian, które utrudniły korzystanie z niego, ale możesz spróbować opublikować posty na temat Pythona, jeśli chcesz wyrazić chęć ponownego dodania funkcji.