Lambda是一个匿名函数,它相当于:
def func(p):
return p.totalScore
现在max变成:
max(players, key=func)
但由于def语句是复合语句,它们不能用于需要表达式的地方,这就是为什么有时会使用lambda的原因。
注意,lambda等价于你在def的return语句中放入的内容。因此,你不能在lambda中使用语句,只允许使用表达式。
max是做什么的?
Max (a, b, c,…[, key=func]) ->值
使用单个iterable参数,返回其最大的项。用两个或
更多参数,返回最大的参数。
因此,它只是返回最大的对象。
密钥是如何工作的?
在Python 2中,默认情况下,key根据一组基于对象类型的规则来比较项(例如字符串总是大于整数)。
要在比较之前修改对象,或者基于特定的属性/索引进行比较,必须使用key参数。
示例1:
举个简单的例子,假设您有一个字符串形式的数字列表,但是您想通过它们的整数值来比较这些项。
>>> lis = ['1', '100', '111', '2']
这里max使用它们的原始值来比较项目(字符串是按字典顺序进行比较的,所以你会得到'2'作为输出):
>>> max(lis)
'2'
使用key和简单的lambda来比较项目的整数值:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
例2:对元组列表应用max。
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
默认情况下,max将比较第一个索引项。如果第一个索引相同,那么它会比较第二个索引。在我的例子中,所有的项目都有一个唯一的第一个索引,所以你会得到这样的答案:
>>> max(lis)
(4, 'e')
但是,如果你想通过索引1的值来比较每一项呢?简单:使用lambda:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
比较迭代对象中包含不同类型对象的项:
包含混合项目的列表:
lis = ['1','100','111','2', 2, 2.57]
在Python 2中,可以比较两种不同类型的项:
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) # compare integer version of each item
'111'
但在Python 3中,你不能再这样做了:
>>> lis = ['1', '100', '111', '2', 2, 2.57]
>>> max(lis)
Traceback (most recent call last):
File "<ipython-input-2-0ce0a02693e4>", line 1, in <module>
max(lis)
TypeError: unorderable types: int() > str()
但这是可行的,因为我们比较的是每个对象的整数版本:
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'