2012-12-02 44 views
28

在使用一些内置的功能,如排序,总和...... 我注意到的key=lambda什么是关键=拉姆达

什么是拉姆达的使用情况如何?它是如何工作的?

还有哪些函数使用key = lambda?

是否有像任何其他键值,key=?

+0

本例中的'key'是一个关键字参数,与'lambda'无关。 – l4mpi

+0

看到这个:http://stackoverflow.com/questions/8966538/syntax-behind-sortedkey-lambda – sachinjain024

回答

57

lambda是匿名函数:

>>> f = lambda: 'foo' 
>>> print f() 
foo 

它在功能,例如sorted()称取一个可调用作为参数经常使用(通常是key关键字参数)。只要它是可调用对象,您也可以在其中提供现有功能而不是lambda。以sorted() function为例。它会按照排序顺序返回给定的迭代:

>>> sorted(['Some', 'words', 'sort', 'differently']) 
['Some', 'differently', 'sort', 'words'] 

但在小写字母之前排序大写字母。使用key关键字,您可以更改每个条目,以便按不同方式排序。我们可以排序之前小写所有的单词,例如:

>>> def lowercased(word): return word.lower() 
... 
>>> lowercased('Some') 
'some' 
>>> sorted(['Some', 'words', 'sort', 'differently'], key=lowercased) 
['differently', 'Some', 'sort', 'words'] 

我们必须创建一个单独的功能,我们无法内联def lowercased()行成sorted()表达:

>>> sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower()) 
    File "<stdin>", line 1 
    sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower()) 
                 ^
SyntaxError: invalid syntax 

一个lambda另一方面,可以直接指定,内联在sorted()表达式中:

>>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda word: word.lower()) 
['differently', 'Some', 'sort', 'words'] 

兰姆达斯仅限于一个表达式,其结果是返回值。

在Python库中有很多地方可以调用关键字或位置参数,包括内置函数。这里有太多的名字,而且他们经常扮演不同的角色。

8

Lambda可以是任何函数。所以,如果你有一个功能

def compare_person(a): 
     return a.age 

你可以排序的人的名单像这样(每个具有年龄属性):

sorted(personArray, key=compare_person) 

这样,名单将由年龄排序升序。

该参数被称为lambda,因为python有一个漂亮的lambda关键字用于定义这样的函数。你可以写下:

sorted(personArray, key=lambda a: a.age) 

它做同样的事情,而不是定义一个函数compare_person并将其传递给排序。

3
>>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda word: word.lower()) 

实际上,上述代码可以是:

>>> sorted(['Some','words','sort','differently'],key=str.lower) 

根据https://docs.python.org/2/library/functions.html?highlight=sorted#sorted,键指定一个参数的函数被用于提取从每个列表元素的比较关键:键= str.lower 。默认值是None(直接比较元素)。

2

在Python,拉姆达是用来定义匿名函数(没有名字的函数)的关键词,这就是为什么他们被称为lambda函数

基本上它用于定义匿名函数能/不能采取参数(多个)并返回数据/表达的值。我们来看一个示例

>>> # Defining a lambda function that takes 2 parameters(as integer) and returns their sum 
... 
>>> lambda num1, num2: num1 + num2 
<function <lambda> at 0x1004b5de8> 
>>> 
>>> # Let's store the returned value in variable & call it(1st way to call) 
... 
>>> addition = lambda num1, num2: num1 + num2 
>>> addition(62, 5) 
67 
>>> addition(1700, 29) 
1729 
>>> 
>>> # Let's call it in other way(2nd way to call, one line call) 
... 
>>> (lambda num1, num2: num1 + num2)(120, 1) 
121 
>>> (lambda num1, num2: num1 + num2)(-68, 2) 
-66 
>>> (lambda num1, num2: num1 + num2)(-68, 2**3) 
-60 
>>> 

现在让我给你的第二问题的回答。 1st的答案也很棒。这是我用自己的方式来解释另一个例子。

假设我们有一个项目列表(整数字符串与数字内容)如下,

nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"] 

,我想用排序()函数对它进行排序,让我们看看会发生。

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"] 
>>> sorted(nums) 
[1, 3, 4, '-1', '-10', '2', '5', '8'] 
>>> 

它并没有给我什么,我预计像下面,

['-10', '-1', 1, '2', 3, 4, '5', '8'] 

这意味着我们需要一些战略(这样来分类可以把我们的字符串项作为一个整数)来实现这一点。这就是为什么使用关键字参数。请看下面的一个。

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"] 
>>> sorted(nums, key=int) 
['-10', '-1', 1, '2', 3, 4, '5', '8'] 
>>> 

允许使用lambda表达式作为关键

>>> names = ["Rishikesh", "aman", "Ajay", "Hemkesh", "sandeep", "Darshan", "Virendra", "Shwetabh"] 
>>> names2 = sorted(names) 
>>> names2 
['Ajay', 'Darshan', 'Hemkesh', 'Rishikesh', 'Shwetabh', 'Virendra', 'aman', 'sandeep'] 
>>> # But I don't want this o/p(here our intention is to treat 'a' same as 'A') 
... 
>>> names3 = sorted(names, key=lambda name:name.lower()) 
>>> names3 
['Ajay', 'aman', 'Darshan', 'Hemkesh', 'Rishikesh', 'sandeep', 'Shwetabh', 'Virendra'] 
>>> 

值可以定义自己的函数(调用),并提供它的关键值。

亲爱的编程人员,我已经写了,你下面的代码,只要尝试了解评论你的解释。我很乐意看到你的解释(很简单)。

>>> def validator(item): 
...  try: 
...   return int(item) 
...  except: 
...   return 0 
... 
>>> sorted(['gurmit', "0", 5, 2, 1, "front", -2, "great"], key=validator) 
[-2, 'gurmit', '0', 'front', 'great', 1, 2, 5] 
>>> 

希望这将是有用