Python 使用';键';和lambda表达式
我来自OOP背景,并试图学习python。 我正在使用Python 使用';键';和lambda表达式,python,function,lambda,Python,Function,Lambda,我来自OOP背景,并试图学习python。 我正在使用max函数,该函数使用lambda表达式返回类型Player的实例,该类型在列表Player中具有最大totalScore def winner(): w = max(players, key=lambda p: p.totalScore) 该函数正确返回类型为Player且具有最大totalScore的实例。 我对以下三件事感到困惑: max功能是如何工作的?它的论点是什么?我看了文档,但没能理解 在max函数中关键字键有什么用途
max
函数,该函数使用lambda表达式返回类型Player
的实例,该类型在列表Player
中具有最大totalScore
def winner():
w = max(players, key=lambda p: p.totalScore)
该函数正确返回类型为Player
且具有最大totalScore
的实例。
我对以下三件事感到困惑:
max
功能是如何工作的?它的论点是什么?我看了文档,但没能理解键有什么用途?我知道它也用于sort
函数的上下文中
感谢高度简化的
max
:
def max(items, key=lambda x: x):
current = item[0]
for item in items:
if key(item) > key(current):
current = item
return current
关于lambda:
>>> ident = lambda x: x
>>> ident(3)
3
>>> ident(5)
5
>>> times_two = lambda x: 2*x
>>> times_two(2)
4
极大简化版的
max
:
def max(items, key=lambda x: x):
current = item[0]
for item in items:
if key(item) > key(current):
current = item
return current
关于lambda:
>>> ident = lambda x: x
>>> ident(3)
3
>>> ident(5)
5
>>> times_two = lambda x: 2*x
>>> times_two(2)
4
根据报告:
max(iterable[,key])max(arg1,arg2,*args[,key])
返回 iterable中最大的项或两个或多个参数中最大的 如果提供了一个位置参数,则iterable必须为非空 iterable(例如非空字符串、元组或列表)。最大的项目 在列表中,返回iterable。如果有两个或多个位置参数 如果提供,则返回最大的位置参数 可选键参数指定一个单参数排序函数 与用于list.sort()的类似。关键参数(如果提供)必须为 以关键字形式(例如,max(a,b,c,key=func)) 这意味着,在您的案例中,您提供了一个列表,在本例中为
玩家
。然后,max
函数将迭代列表中的所有项目,并相互比较以获得“最大值”
可以想象,对于像player
这样的复杂对象,确定其值以进行比较是一件棘手的事情,因此给您key
参数来确定max
函数将如何决定每个player
的值。在这种情况下,您使用lambda函数表示“对于players
中的每个p
,获取p.totalscore
,并将其作为他的值进行比较”。根据:
max(iterable[,key])max(arg1,arg2,*args[,key])
返回 iterable中最大的项或两个或多个参数中最大的 如果提供了一个位置参数,则iterable必须为非空 iterable(例如非空字符串、元组或列表)。最大的项目 在列表中,返回iterable。如果有两个或多个位置参数 如果提供,则返回最大的位置参数 可选键参数指定一个单参数排序函数 与用于list.sort()的类似。关键参数(如果提供)必须为 以关键字形式(例如,max(a,b,c,key=func)) 这意味着,在您的案例中,您提供了一个列表,在本例中为
玩家
。然后,max
函数将迭代列表中的所有项目,并相互比较以获得“最大值”
可以想象,对于像
player
这样的复杂对象,确定其值以进行比较是一件棘手的事情,因此给您key
参数来确定max
函数将如何决定每个player
的值。在本例中,您使用lambda函数表示“对于玩家中的每个p
,获取p.totalscore
,并将其作为比较值”。lambda
是一个匿名函数,它相当于:
def func(p):
return p.totalScore
现在max
变成:
max(players, key=func)
但是由于def
语句是复合语句,因此不能在需要表达式的地方使用它们,这就是为什么有时使用lambda
请注意,lambda
相当于您在def
的返回语句中输入的内容。因此,不能在lambda
中使用语句,只允许使用表达式
max
做什么?
最大值(a,b,c,…[,key=func])->值
使用单个iterable参数,返回其最大项。有两个或两个
更多参数,返回最大参数
因此,它只返回最大的对象
按键如何工作? 默认情况下,Python2中的键会根据对象的类型(例如字符串总是大于整数)比较基于a的项 要在比较之前修改对象,或基于特定属性/索引进行比较,必须使用
键
参数
例1:
举一个简单的例子,假设您有一个字符串形式的数字列表,但您希望通过它们的整数值来比较这些项
>>> lis = ['1', '100', '111', '2']
此处max
使用项目的原始值对项目进行比较(字符串按字典顺序进行比较,以便将'2'
作为输出):
要按整数值比较项目,请使用键
和简单的lambda
:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
示例2:将max
应用于元组列表
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
默认情况下,max
将按第一个索引比较项目。如果第一个索引相同,那么它将比较第二个索引。在我的示例中,所有项目都有唯一的第一个索引,因此您可以得到以下答案:
>>> max(lis)
(4, 'e')
但是,如果您想通过索引1处的值来比较每个项目,该怎么办?简单:使用lambda
:
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
比较包含ob的iterable中的项
def sum(a, b, f):
return (f(a) + f(b))
>>> sum(2, 2, lambda a: a * 2)
8
max(iterable[, key=func]) -> value
max(a, b, c, ...[, key=func]) -> value
With a single iterable argument, return its largest item.
With two or more arguments, return the largest argument.
max(1, 3, 5, 7)
>>>7
max([1, 3, 5, 7])
>>>7
people = [('Barack', 'Obama'), ('Oprah', 'Winfrey'), ('Mahatma', 'Gandhi')]
max(people, key=lambda x: x[1])
>>>('Oprah', 'Winfrey')
d = {'aim':99, 'aid': 45, 'axe': 59, 'big': 9, 'short': 995, 'sin':12, 'sword':1, 'friend':1000, 'artwork':23}
>>> max(d.keys())
'sword'
>>>max(d.keys(), key=lambda x: len(x))
'artwork'
>>> max(d.keys(), key=lambda x: d[x])
'friend'