我很难理解Python中的概念,特别是与lambda函数的使用有关。我将参考官方Python文档中使用的示例。
以下是示例:(found here)
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
我理解lambda本身的功能,是一个匿名函数。但我不明白它是如何完全接受参数而不是正常的可调用函数:如add(x,y)
,x
和y
这里是作为输入发送给{的实际参数{1}}函数,而在函数定义中看到的形式参数可以是:
add()
但是在上面的第一个例子中,发送给lambda的实际参数是什么?当def add(val1, val2):
return val1 + val2
是形式参数时(当然可以取任何名称。)
答案 0 :(得分:2)
lambda pair: pair[1]
完全等同于以下函数定义:
def lambda_equivalent (pair):
return pair[1]
所以pair
是匿名lambda函数接受的参数。它只有一个参数。
然后将该函数作为参数传递给key
函数的list.sort
参数。所以它再次等同于以下内容:
pairs.sort(key=lambda_equivalent)
然后list.sort
为每个项调用key
函数来确定实际值列表项应按排序方式。因此list.sort
最终将调用key((1, 'one'))
和key((2, 'two'))
等,因此列表项 - 元组 - 是传递给键函数的参数。对于你的lambda,这将是pair
。
答案 1 :(得分:1)
尽管lambda
函数定义与普通函数的形式不同,但它们仍然以完全相同的方式调用:
>>> add = lambda x, y: x + y
>>> add(1, 2)
3
>>> def add(x, y):
... return x + y
...
>>> add(1, 2)
3
在您的示例中,lambda pair: pair[1]
相当于:
def sort_by_pair(pair):
return pair[1]
结果函数传递给list.sort
。 list.sort
期望此值是可调用的,接受单个参数。在幕后list.sort
仍会为列表中的每个元素调用key
的功能。因此,每次调用key
函数时,它都会从列表中传递一个元素:
>>> def sort_by_pair(pair):
... print('Called with argument:', pair)
... return pair[1]
...
>>>
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=sort_by_pair)
Called with argument: (1, 'one')
Called with argument: (2, 'two')
Called with argument: (3, 'three')
Called with argument: (4, 'four')
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
请注意,如果在传递给lambda
时使list.sort
不接受任何参数,则会引发错误:
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=lambda: None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: <lambda>() takes 0 positional arguments but 1 was given
答案 2 :(得分:0)
在上面的示例中,如果我们采用最简单的那样:
dict = {1:2, 2:1}
然后进行排序我们会在第二个解决方案中执行sorted(l.items(), key=lambda (x,y):y)
或sorted(l.items(), key=lambda (x):x[1])
x包含x [0]和x [1]之类的元素列表,这些元素是每个元素的键和值字典元素。
现在就你的情况对待对,就像一个包含对[0] 和对[1] 的列表,所以实际的参数被发送到lambda是元组的第二个元素(它是列表的元素),如 [tuple1,tuple2,tuple3]