Python 中的 lambda 函数
文章目录
1. 为什么使用 lambda 函数
# 常规函数的定义
def sq(x):
return x*x
map(sq, [y for y in range(10)])
# 使用 lambda 函数
map(lambda x:x**2, [y for y in range(10)])
从以上代码可以看出,使用 lambda 函数减少了代码的冗余,另外,使用 lambda(匿名函数) ,对于使用次数很少的函数,不需要费神地对函数进行命名,可以快速实现某项功能,最后,lambda 函数使代码地可读性更强,程序看起来更简洁
lambda 函数语法
lambda argument_list:expression
argument_list: 参数列表 同 Python 中 function 中函数的参数列表一样
a
a, b
*args
**kwargs
a, b = 1, args
None
...
expression: 表达式 表达式中出现的参数都需要在 argument_list 中有定义,并且 表达式只能是单行的
1
None
a + b
sum(a)
1 if a >10 else 0
...
既然使用 lambda
函数可以减少代码的冗余,那 lambda
函数在一定程度上是否可以提高代码的效率呢?
我们做个测试
import time
# 测试的Def函数
def square1(n):
return n ** 2
# 测试的Lambda函数
square2 = lambda n: n ** 2
time_begin = time.time()
print(time_begin)
# 使用Def函数
i = 0
while i < 1000000000:
square1(100)
i += 1
time_stop1 = time.time()
print(time_stop1)
# 使用lambda函数
i = 0
while i < 1000000000:
square2(100)
i += 1
time_stop2 = time.time()
print(time_stop2)
print(time_stop1 - time_begin)
print(time_stop2 - time_stop1)
if (time_stop2 - time_stop1) > (time_stop1 - time_begin):
print('lambda 函数没有提高代码的运行效率反而使代码运行速度变慢')
else:
print('lambda 函数在迭代次数很大时(10亿次)时可以看到明显的效率提高')
# 1618471673.8691976
# 1618472146.0701563
# 1618472594.563975
# 472.2009587287903
# 448.4938187599182
#lambda 函数在迭代次数很大时(10亿次)时可以看到明显的效率提高
2. lambda 函数的用处
1)直接将函数赋给变量
然后像一般的函数那样使用(即类似于 def 模式的简化版)
a = lambda x, y, z:x*y*z
a(2, 3, 4)
# 24
直接传参
a = (lambda x:x**2)(3)
print(a)
# 9
2)将 lambda
函数作为参数传递给 python
一些内置函数使用
与 filter
结合使用
a = filter(lambda x:x%3 = 0,[1, 2, 3, 4, 5, 6])
print(list(a)) # filter 类型的参数需要使用 list() 方法来转换
# [3, 6]
与 map
结合使用
squares = map(lambda x:x**2, range(5))
print(list(squares)) # map 类型的参数需要使用 list() 方法来转换
# [0,1,4,9,16]
与 sorted
结合使用
a = [('b',3),('a',2),('d',1),('c',4)]
sorted(a,key=lambda x:x[0])
# [('a',2),('b',3),('c',4),('d',1)]
与 reduce
结合使用
from functools import reduce
print(reduce(lambda a,b:'{},{}'.format(a,b),[1,2,3,4,5,6,7,8,9]))
1,2,3,4,5,6,7,8,9
3)将 lambda
函数嵌入到一般的函数中,作为返回值返回
def increment(n):
return lambda x:x+n
f = increment(4)
f(2)
# 相较一般的函数定义 类似的是将两个参数分开来定义
4)在串联字符串时也可以使用 lambda
函数
x = (lambda x='Boo', y='Too', z='Zoo': x+y+z)
print(x('Foo'))
# 'FooTooZoo'
※ 5)在 tkinter
库中定义内联的 callback
函数
import sys
from tkinter import Button
x = Button(text='Press me', command=(lambda :sys.stdout.write('Hello world\n')))
x.pack()
x.mainloop()
# 个人觉得 在'tkinter'中作为内联函数使用是'lambda'函数存在最大的作用
# 下面是作者个人使用到'lambda'函数解决的最大问题的方式
# (此处要插入链接)
6)判断字符串是否是以某个特定的字母开头
Names = ['Anne', 'Amy', 'Bob', 'David', 'Carrie', 'Barbara', 'Zach']
B_Name = filter(lambda x:x.startswith('B'), Names)
print(list(B_Name))
# ['Bob', 'Barbara']
7)求两个列表的元素和
a = [1,2,3,4]
b = [5,6,7,8]
print(list(map(lambda x,y:x+y, a,b)))
# [6,8,10,12]
8)求字符串每个单词的长度
sentence = "Welcome To Beijing!"
words = sentence.split()
lengths = map(lambda x:len(x),words)
print(list(lengths))
# [7,2,8]