Python lambda表达式中的实际参数

时间:2017-08-15 11:16:22

标签: python

我很难理解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)xy这里是作为输入发送给{的实际参数{1}}函数,而在函数定义中看到的形式参数可以是:

add()

但是在上面的第一个例子中,发送给lambda的实际参数是什么?当def add(val1, val2): return val1 + val2 是形式参数时(当然可以取任何名称。)

3 个答案:

答案 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.sortlist.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]