我遇到了下面的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)]
答案 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
函数中也会发生类似情况。