Python 使用';键';和lambda表达式

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函数中关键字键有什么用途

我来自OOP背景,并试图学习python。 我正在使用
max
函数,该函数使用lambda表达式返回类型
Player
的实例,该类型在列表
Player
中具有最大
totalScore

def winner():
    w = max(players, key=lambda p: p.totalScore)
该函数正确返回类型为
Player
且具有最大
totalScore
的实例。 我对以下三件事感到困惑:

  • max
    功能是如何工作的?它的论点是什么?我看了文档,但没能理解
  • 在max函数中关键字
    有什么用途?我知道它也用于
    sort
    函数的上下文中
  • lambda表达式的含义?如何阅读?它们是如何工作的
  • 这些都是非常不懂概念的问题,但会帮助我理解语言。如果你能举个例子来解释,那会有帮助的。
    感谢高度简化的
    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'