我来自OOP背景,正在努力学习Python. 我正在使用max函数,该函数使用lambda表达式返回列表players中具有最大totalScore的类型Player的实例.

def winner():
    w = max(players, key=lambda p: p.totalScore)

该函数正确返回最大值为totalScore的类型Player的实例.

  1. max函数是如何工作的?它所采取的论据是什么?我看了文档,但没能理解.
  2. 关键字key在max函数中有什么用途?我知道它也用于sort函数的上下文中
  3. lambda这个短语的意思是什么?怎么读呢?它们是怎么工作的?

这些都是非常无趣的概念性问题,但会帮助我理解语言.如果你能举个例子来解释,那会有帮助的.

推荐答案

lambda为匿名函数,相当于:

def func(p):
   return p.totalScore     

现在max变成了:

max(players, key=func)

但是,由于def个语句是复合语句,它们不能用于需要表达式的地方,这就是为什么有时使用lambda个语句的原因.

请注意,lambda相当于您在返回值为def的语句中输入的值.因此,您不能在lambda内使用语句,只允许使用表达式.


What does 100 do?

max(a, b, c, ...[, key=func]) -> value

使用单个可迭代参数,返回其最大项.带两个或两个 参数越多,返回的参数越大.

因此,它只返回最大的对象.


How does 100 work?

在Python2中,默认情况下key会根据对象的类型(例如字符串总是大于整数)根据set of rules来比较项目.

要在比较之前修改对象,或基于特定属性/索引进行比较,必须使用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')

Comparing items in an iterable that contains objects of different type:

混合项目列表:

lis = ['1','100','111','2', 2, 2.57]

In Python 2 it is possible to compare items of two different types:

>>> max(lis)  # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x))  # compare integer version of each item
'111'

But in Python 3 you can't do that any more:

>>> 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'

Python相关问答推荐

Tkinter -控制调色板的位置

acme错误-Veritas错误:模块收件箱没有属性linear_util'

将特定列信息移动到当前行下的新行

如何让程序打印新段落上的每一行?

如何在给定的条件下使numpy数组的计算速度最快?

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

移动条情节旁边的半小提琴情节在海运

Pandas Loc Select 到NaN和值列表

索引到 torch 张量,沿轴具有可变长度索引

lityter不让我输入左边的方括号,'

在Python中调用变量(特别是Tkinter)

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

在Python中计算连续天数

如何杀死一个进程,我的Python可执行文件以sudo启动?

如何在两列上groupBy,并使用pyspark计算每个分组列的平均总价值

跳过嵌套JSON中的级别并转换为Pandas Rame

如何在Great Table中处理inf和nans

如何在FastAPI中替换Pydantic的constr,以便在BaseModel之外使用?'

如何合并具有相同元素的 torch 矩阵的行?