lambda表达式常用来声明匿名函数,即没有函数名字的临时使用的小函数,例如第2章中列表对象的sort()方法以及内置函数sorted()中key参数。lambda表达式只可以包含一个表达式,不允许包含其他复杂的语句,但在表达式中可以调用其他函数,并支持默认值参数和关键字参数,该表达式的计算结果相当于函数的返回值。下面的代码演示了不同情况下lambda表达式的应用。
1 >>> f = lambda x,y,z:x+y+z
2 >>> print(f(1,2,3)) #把lambda表达式当做函数使用
3 6
4 >>>
5 >>> g = lambda x,y = 2,z=3:x + y + z #含有默认值参数
6 >>> print(g(1))
7 6
8 >>>
9 >>>
10 >>> print(g(2,z=4,y=5)) #使用关键字参数
11 11
12 >>>
13 >>> l = [(lambda x:x**2),(lambda x:x**3),(lambda x:x**4)]
14 >>> print(l[0](2),l[1](2),l[2](2))
15 4 8 16
16 >>>
17 >>> d = {'f1':(lambda :2+3),'f2':(lambda :2*3),'f3':(lambda :2**3)}
18 >>>
19 >>> print(d['f1'](),d['f2'](),d['f3']())
20 5 6 8
21 >>>
22 >>> l = [1,2,3,4,5]
23 >>> print(map((lambda x:x+10),l))
24 <map object at 0x00000000037E5198>
25 >>> #没有名字的lambda表达式,作为函数参数
26 >>>
27 >>>
28 >>> def demo(n):
29 return n*n
30
31 >>> demo(5)
32 25
33 >>>
34 >>> al = [1,2,3,4,5]
35 >>> list(map(lambda x:demo(x),al)) #在lambda表达式中调用函数
36 [1, 4, 9, 16, 25]
37 >>>
38 >>>
39 >>> data = list(range(20))
40 >>> print(data)
41 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
42 >>>
43 >>> import random
44 >>> random.shuffle(data)
45 >>> data
46 [12, 11, 18, 7, 14, 5, 0, 8, 3, 2, 9, 1, 17, 6, 19, 13, 4, 10, 15, 16]
47 >>>
48 >>>
49 >>> data.sort(key=lambda x:x) #用在列表的sort()方法中,作为函数参数
50 >>>
51 >>> data
52 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
53 >>>
54 >>> data.sort(key=lambda x:len(str(x)),reverse=True)
55 >>> data
56 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
57 >>>
58 >>>
注意:在使用lambda表达式是,要注意变量作用域可能会带来的问题,例如,下面的代码中变量x是在外部作用域中定义的,对lambda表达式而言不是局部变量,从而导致出现了错误。
1 >>> r = [] 2 >>> for x in range(10): 3 r.append(lambda :x**2) 4 5 6 >>> r 7 [<function <lambda> at 0x00000000037E8F28>, <function <lambda> at 0x00000000037E9048>, <function <lambda> at 0x00000000037E9268>,
<function <lambda> at 0x00000000037E92F0>, <function <lambda> at 0x00000000037E9378>, <function <lambda> at 0x00000000037E9400>,
<function <lambda> at 0x00000000037E9488>, <function <lambda> at 0x00000000037E9510>, <function <lambda> at 0x00000000037E9598>,
<function <lambda> at 0x00000000037E9620>] 8 >>> 9 >>> 10 >>> r[0]() 11 81 12 >>> 13 >>> r[1]() 14 81 15 >>>
而修改为下面的代码,可以得到正确的结果。
1 >>> r = []
2 >>> for x in range(10):
3 r.append(lambda n=x:n**2)
4
5
6 >>> r[0]()
7 0
8 >>>
9 >>> r[1]()
10 1
11 >>>
12 >>> r[9]()
13 81
14 >>>