我来自OOP背景,尝试学习python。我使用的max函数使用lambda表达式返回列表中Player具有最大类型的实例。totalScore``players
max
Player
totalScore``players
def winner(): w = max(players, key=lambda p: p.totalScore)
该函数正确地返回Player具有maximum类型的实例totalScore。我对以下三件事感到困惑:
totalScore
key
sort
这些都是非常笨拙的概念性问题,但可以帮助我理解语言。如果您可以提供示例进行解释,这将有所帮助。谢谢
lambda 是一个匿名函数,它等效于:
lambda
def func(p): return p.totalScore
现在max变成:
max(players, key=func)
但是由于def语句是复合语句,因此不能在需要表达式的地方使用它们,这就是有时lambda使用的原因。
def
请注意,这lambda等效于您在的return语句中输入的内容def。因此,您不能在内使用语句lambda,仅允许使用表达式。
怎么max办?
max(a,b,c,… [,key = func])->值 使用单个可迭代的参数,返回其最大的项目。具有两个或更多参数,返回最大参数。
max(a,b,c,… [,key = func])->值
使用单个可迭代的参数,返回其最大的项目。具有两个或更多参数,返回最大参数。
因此,它仅返回最大的对象。
key 工作如何?
在Python 2中,默认情况下key根据对象的类型根据一组规则比较项目(例如,字符串始终大于整数)。
要在比较之前修改对象,或基于特定的属性/索引进行比较,必须使用key参数。
范例1:
一个简单的示例,假设您有一个字符串形式的数字列表,但是您想按其整数值比较这些项目。
>>> lis = ['1', '100', '111', '2']
这里max使用它们的原始值比较项目(按字母顺序比较字符串,这样您就可以得到'2'输出):
'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'