python中的Lambda函数语法

时间:2018-05-09 03:56:05

标签: python sorting lambda

我遇到了下面的sorted()示例,无法弄清楚为什么lambda student: student[2]可以表示指定元组中整数的函数。

任何人都可以列出机制或更清楚的例子,说明python如何知道lambda函数学生应该从student_tuples提取数据吗?

student_tuples = [
        ('john', 'A', 15),
        ('jane', 'B', 12),
        ('dave', 'B', 10)]

sorted(student_tuples, key=lambda student: student[2])   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

2 个答案:

答案 0 :(得分:0)

lambda student: student[2]等同于以下函数,除了没有名称:

def <anonymous function>(student):
  return student[2]

它从student_tuples结束的原因是因为sorted()函数将每个单独的元素从其第一个参数(要排序的序列)传递到其key参数(函数)接受一个元素并返回相应的排序键)。因此,sorted()依次将student_tuples的每个元素传递给lambda函数,在此期间,元素的值临时分配给student变量。

答案 1 :(得分:0)

lambda student: student[2]

更清楚:

lambda x: x[2]

lambda表达式返回一个函数。这个函数的参数在&#39;:&#39;之前。并以逗号分隔。

lambda x,y: x + y

该功能没有名称。但你可以想象lambda创建一个抽象函数。 lambda表达式返回一个函数。 (Lambda是函数的本质)。 您也可以为lambda表达式命名:

f = lambda x: x[2]

现在您可以使用该名称来调用该函数。

f(["a", "b", "c"]) ## returns "c" because the list element "c" has index 2

list(map(f, student_tuples))
## [15, 12, 10]

或使用lambda表达式:

list(map(lambda x: x[2], student_tuples))
## [15, 12, 10]

实际上是排序中发生的事情: lambda函数应用于列表的每个元素(map)。 执行list()所需的map()map,因为map被懒惰地评估(承诺执行它但尚未执行)。 懒惰的评估实际上是lambdas的嵌套......好吧,lambdas是函数式编程的核心。像Lisp这样的编程语言可以让你清楚lambda实际上是什么。 (你也可以google for lambda calculus)。

在R中,一种函数式语言,在这种情况下,确定可迭代对象索引的顺序,然后应用于对象 - 用于排序/排序 - 以实现最终的排序版本(函数sort)< / p>

我想,在Python的sorted函数中也会发生类似情况。