考虑以下python2代码
In [5]: points = [ (1,2), (2,3)]
In [6]: min(points, key=lambda (x, y): (x*x + y*y))
Out[6]: (1, 2)
python3不支持此功能,我必须执行以下操作:
>>> min(points, key=lambda p: p[0]*p[0] + p[1]*p[1])
(1, 2)
这非常丑陋。如果lambda是一个函数,我可以做
def some_name_to_think_of(p):
x, y = p
return x*x + y*y
在python3中删除此功能会强制代码执行丑陋的方式(使用魔术索引)或创建不必要的功能(最麻烦的部分是为这些不必要的功能想到好名字)
我认为该功能至少应单独添加回lambda。有没有好的选择?
更新:我正在使用以下帮助程序扩展答案中的想法
def star(f):
return lambda args: f(*args)
min(points, key=star(lambda x,y: (x*x + y*y))
Update2:的清洁版本star
import functools
def star(f):
@functools.wraps(f):
def f_inner(args):
return f(*args)
return f_inner
lambda
他反对的精神相同map
,reduce
并且filter
。
lambda
计划在py3k中删除,因为它基本上是该语言的主要缺陷。但是没有人能就定义匿名功能的合适选择达成共识,因此,Guido最终屈服了,就是这样。
map
并且filter
最好用理解力代替,我也喜欢reduce
)
lambda
完全有可能将其从语言中删除,然后撤消使它更难使用的更改,但是如果您想表达一下希望看到添加的功能,可以尝试在python-ideas上发布。