【问题标题】:Explaination of this lambda function please?请解释一下这个 lambda 函数?
【发布时间】:2014-02-14 06:26:41
【问题描述】:

我使用sorted(list_of_tuples, key = lambda tup: tup[1]) 从互联网上找到的代码中对元组列表进行了排序。我不明白 lambda 函数在这个命令中是如何工作的。 lambda 函数是否返回元组的第一个索引?为什么tup 而不是tuple: 之前的第一个 tup 表示什么?是传入的参数吗? Lambda 函数是否评估 : 的右侧并返回它?

我在 StackOverflow 上找到了对 lambda 函数的解释,其中人们以“非功能性”的方式写出 Lambda 函数作为比较,但我真的不明白哪些部分等同于哪些部分。

谢谢

【问题讨论】:

    标签: python lambda


    【解决方案1】:

    lambda 是一个内联函数,所以你可以这样重写它:

    def sortkey(tup):
        return tup[1]
    
    sorted(list_of_tuples, key=sortkey)
    

    现在你看到冒号前的tup是函数的参数tup[1]返回第二个元素(第一个是tup[0]

    此 lambda 是 sort 函数的 key,这意味着您按 list_of_tuples 的每个元素的第二个进行排序。 sorted() 将每个元素传递给key 函数,按所述函数的返回值排序

    正如@kojiro 所指出的,operator 模块中存在一个内置函数,称为itemgetter。您将索引传递给该函数,它会返回一个函数,该函数执行您的 lambda 函数

    演示如何只调用一次键的示例:

    >>> def sortkey(x):
    ...     print x
    ...     return x
    
    >>> inputlist = range(5)
    >>> random.shuffle(inputlist)
    >>> sorted(inputlist, key=sortkey)
    0
    3
    4
    2
    1
    [0, 1, 2, 3, 4]
    

    【讨论】:

    • 写这个 lambda 的另一种方式是operator.itemgetter(1)
    • 非常正确,但不是 OP 的问题
    • 正确,但可能对偶然发现此答案的未来读者有用。
    • @mhlester 那么 Python 是如何知道将元组作为 lambda 函数的参数传入的呢?为什么它不输入整个元组列表?
    • 将 lambda 替换为在返回获取的项目之前打印其参数列表的函数可能是说明性的。
    【解决方案2】:

    The docs解释一下:

    可以使用lambda 关键字创建小型匿名函数。此函数返回其两个参数的总和:lambda a, b: a+b。 Lambda 函数可用于需要函数对象的任何地方。它们在语法上仅限于单个表达式。从语义上讲,它们只是普通函数定义的语法糖。

    所以,换句话说:

    x = lambda AAAA: EEEE
    

    几乎等同于

    def x(AAAA):
        return EEEE
    

    其中AAAA 是参数,EEEE 是表达式。

    为什么几乎相等?因为底层函数对象有不同的名字:def的情况下是x,而lambda的情况下是<lambda>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-31
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 2013-11-19
      • 2014-04-04
      • 1970-01-01
      相关资源
      最近更新 更多