021函数:lambda表达式
一、匿名函数:不需要命名的函数
>>> def ds(x):
return 2 * x + 1
>>> ds(5)
11
>>> lambda x : 2 * x + 1
<function <lambda> at 0x000002306677A700>
>>> g = lambda x : 2 * x + 1
>>> g(5)
11
二、lambda表达式的重要作用
1、节省定义函数的过程,使代码更精简
2、不用考虑命名问题
3、简化代码的可读性
三、两个实用的BIF
1、filter():过滤器(保留重要信息,过滤无用资料)
>>> list(filter(None,[1,0,False,True]))
[1, True]
>>> def odd(x):
return x % 2
>>> temp = range(10)
>>> show = filter(odd,temp)
>>> list(show)
[1, 3, 5, 7, 9]
>>> list(filter(lambda x : x%2 ,range(10)))
[1, 3, 5, 7, 9]
2、map():映射
>>> list(map(lambda x : x*2 ,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
==================================================================================
测试题
0.请使用lambda表达式将下列函数转变为匿名函数
lambda x,y=3 : x * y
1.请将下面的匿名函数变为普通函数?
def fun_A(x,y=3):
return x*y
lambda x : x if x% 2 else None
2.你可以利用filter()和lambda表达式快速求出100以内所有3的倍数吗?
list(filter(lambda x: x if x%3 == 0 else None , range(100)))
3.还记得列表推导式吗?完全可以使用列表推导式代替filter()和lambda组合,你可以做到吗?
如第2题:i for i in range(100) if i%3 == 0
4.还记得zip吗?使用zip会将两数以元祖形式绑定在一起,例如:
list(zip([1,3,5,7,9],[2,4,6,8,10]))
[(1,2),(3,4),(5,6),(7,8),(9,10)]
但如果希望打包的形式是灵活多变的列表而不是元祖,(希望是[[1,2],[3,4],[5,6],[7,8],[9,10]]这种形式),你能做到吗?(采用map和lambda表达式)
list(map(lambda x,y: [x,y],[1,3,5,7,9],[2,4,6,8,10]))
5.请目测一下表达式会打印什么?
def make_repeat(n):
return lambda s:s*n
double = make_repeat(2)
print(double(8))
print(double('FishC'))
16
FishCFishC