如何使用lambda一行实现一个函数 匿名函数在啥时候用呢?

常规函数:

1
2
3
4
def add(x):
return x + 1

print(add(5))

6

匿名函数

1
print((lambda x: x + 1)(5))

6

匿名函数格式
lambda 参数1,参数1,参数1,…参数n : 表达式
应用场景:如果代码有很多重复,往往要将重复代码抽成一个方法函数,然后在需要的地方调用就可以了
有一种情况是:函数只用一次就不要了,这时候就可以使用匿名函数 lambda 上场,简化代码
一般函数传参:

1
2
3
def add(x, y):
return x + y
print(add(1, 2))

3

匿名函数传参
添加 () 传参

1
2
print((lambda x, y: x + y)(10, 20))
(lambda *args: print(args))(1, 2)

30
(1, 2)

这句代码的意思是说
遍历 0-9 这 10 个数字
然后把每个数逐个交给匿名函数处理
处理的方式就是 x % 2
最后将得到的结果放进列表里面

1
2
my_list = [(lambda x: x % 2)(x) for x in range(10)]
print(my_list)

[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

所谓 “匿名”
说的就是这个函数没有定义名称
不再像我们之前使用自定义函数那样
还必要给函数起个名称

下面是使用传统函数实现以上方法,仔细看区别之处
使用匿名函数极大的简化了代码量,
使用匿名函数使程序主逻辑更清晰,但前提是:能理解匿名函数的实现功能细节
能否看懂别人写的匿名函数将是关键点,这一点与 Excel 中的公式相似

匿名函数:无名函数
传统函数:有名函数

1
2
3
4
5
6
7
def get_list(n):
my_list2 = []
for i in range(n):
my_list2.append(i % 2)
return my_list2

print(get_list(10))

[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

避免为了匿名而匿名,画蛇添足
像下面这样的代码
虽然定义了匿名函数,但还是返回来像传统有名函数那样调用,就应尽量避免

1
2
add = (lambda x, y: x + y)
print(add(1, 2))

3

匿名函数在啥时候用呢?

匿名函数在那些只需要执行一次就不要了的场景中使用
可以想到在函数式编程中将运用很广泛
结合 Python 中的 map() filter() 这两个函数高效使用

map() 函数

map(函数对象,序列)
map函数有两个参数
第一个可以传入 函数 , 第二个传入 序列
当执行这个 map 时,序列里面的每个值都会被取出,然后拿去执行传入的函数

map函数结合传统有名函数使用

1
2
3
4
5
6
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def add(x):
return x + 5

print(list(map(add, my_list)))

[6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

map 函数结合匿名函数使用

1
2
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(list(map((lambda x: x + 5), my_list)))

[6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

filter() 函数

filter(函数对象,序列)
filter 中传入的函数对象一般用于判断
过滤判断提取出:一个列表中的数 %2 是等于 0 的数,

1
print(list(filter((lambda x: x % 2 == 0), my_list)))

[2, 4, 6, 8, 10]