python中lambda用法

1.lambda简单介绍

lambda 在Python编程中使用的频率非常高,我们通常提及的lambda表达式其实是python中的一类特殊的定义函数的形式,使用它可以定义一个匿名函数。即当你需要一个函数,但又不想费神去命名一个函数,这时候,就可以使用 lambda了。
看个例子:

# 求 x+1 的和
g = lambda x:x+1
print(g(2))

# 结果为
3

可以这样认为,lambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体,用函数来表示为:

def func(x):
    return x + 1
print(func(2))

以上可以看出,lambda 表达式使得代码更为紧凑,但理解起来却没有定义函数那么看起来直白易懂。因此,关于使不使用 lambda表达式一直存在争议,就看个人选择了。

2.lambda语法

lambda函数的语法只包含一个语句,如下:

lambda [arg1 [,arg2,.....argn]]:expression

其中,lambda是Python预留的关键字,arg和expression由用户自定义。
代码示例

def func(a,b,c):
    return a + b + c
print(func(1,2,3))
# 结果为6

# lambda函数
f = lambda a,b,c:a + b + c
print(f(1,2,3))
# 结果为6

# 在代码: f = lambda a,b,c:a + b + c中,lambda表示匿名函数,
# 冒号":"之前的a,b,c表示它们是这个函数的参数。
# 匿名函数不需要return来返回值,表达式本身结果就是返回值。

3.lambda函数示例

3.1无参匿名函数

# 分号前无任何参数
t = lambda : True
print(t())

等价于下面的def定义的函数:

def func():
    return True
print(func())

3.2带参数匿名函数

# 带1个参数
f = lambda x: x**2

# 带多个参数
f = lambda x,y,z:x+y+z

# 存在默认值的参数
f = lambda x,y=3:x*y

3.3输入任意个数的参数

# 这里*z传入的是任意个数的参数
f = lambda *z:z

3.4输入带键值对的参数

# 这里**arg传入的是带键值对的参数
f = lambda **arg: arg

4. lambda函数的用法

4.1 将函数赋值给一个变量,然后再像一般函数调用

f = lambda x,y,z:x+y+z
print(f(1,2,3))
6

4.2直接在lambda表达式后面传递实参

f =(lambda x,y: x if x > y else y)(1,2)
print(f)
# 判断字符串是否以某个字母开头
f = (lambda x:x.startswith('B'))('Bob')
print(f)
True

4.3 将lambda嵌套到普通函数中,lambda函数本身做为return的值

代码示例:

def add(n):
    return lambda x: x + n
f = add(1)
print(f(2))

例题1.字符串拼接

f = (lambda x="I",y="love",z="you": x+y+z)
print(f())
print(f("you"))
print(f("you","love","me"))

# 结果如下:
Iloveyou
youloveyou
youloveme

例题2. 和列表结合使用

L = [lambda x: x**2,\
     lambda y: y**3,\
     lambda z: z**4]

for x in L:
    print(x(2))

# 结果如下:
4
8
16

# 也可以像下面这样调用:
print(L[0](2))

# 结果如下:
4

例题3. 和字典结合使用

key = 'B'
dic = {'A':lambda: 2*2,\
       'B':lambda: 2*4,\
       'C':lambda: 2*6}
print(dic[key]())

# 结果为:
8

例题4. 求最小值

lower = (lambda x,y: x if x < y else y)(2,3)
print(lower)

# 或者为:
lower = lambda x,y: x if x < y else y
print(lower(1,2))

4.4 将lambda函数作为参数传递给其他函数

1. 结合map函数使用

此时lambda函数用于指定对列表中每一个元素的共同操作

代码示例:

a = [1,2,3,4]
b = [5,6,7,8]
# 两个列表元素的和
print(list(map(lambda x,y:x+y,a,b)))

# 结果:
[6, 8, 10, 12]

squares = map(lambda x:x**2,range(5))
print(list(squares))

# 结果:
[0, 1, 4, 9, 16]
# 求字符串每个单词的长度
sentence = "Hello World Hi"
words = sentence.split()
lengths = map(lambda x:len(x),words)
print(list(lengths))

# 写成一行
print(list(map(lambda x:len(x),"Hello World Hi".split())))

# 结果为:
[5, 5, 2]

2. 结合filter函数使用

此时lambda函数用于指定过滤列表元素的条件。

代码示例:

# 筛选偶数
print(list(filter(lambda x:x%2==0,[1,2,3,4,5,6])))

# 等价于下面的列表生成式
li = [i for i in [1,2,3,4,5,6] if i % 2 == 0]
print(li)

# 结果为:
[2, 4, 6]
# 选出以B开头的名字
names = ['Anne','Amy','Bob','David','Carrie','Barbara']
name = filter(lambda x:x.startswith('B'),names)
print(list(name))

# 结果为:
['Bob', 'Barbara']

3. 和filter函数和map函数结合使用

代码示例:

squares = map(lambda x: x**2,range(10))
filters = filter(lambda x:x>5 and x<50,squares)

print(list(filters))

# 结果为:
[9, 16, 25, 36, 49]

4. 结合sorted函数使用

此时lambda函数用于指定对列表中所有元素进行排序的准则

代码示例:

info = [('James',32),('Alies',20),('Wendy',25)]
# 按照第二个,也就是索引为1的元素排序
print(sorted(info,key=lambda x:x[1]))

5. 结合reduce函数使用

此时lambda函数用于指定列表中两两相邻元素的结合条件。

代码示例:

# 两数相加
def add(x,y):
    return x + y

# 计算列表元素累加和1+2+3+4+5
print(reduce(add,[1,2,3,4,5]))

# 使用lambda匿名函数
print(reduce(lambda x,y:x+y,[1,2,3,4,5]))

注意事项

lambda 并不会带来程序运行效率的提高,只会使代码更简洁。

如果可以使用for…in…if来完成的,坚决不用lambda。

如果使用lambda,lambda内不要包含循环,如果有,应定义函数来完成,使代码获得可重用性和更好的可读性。

lambda 是为了减少单行函数的定义而存在的。