在前一章学习了函数定义,如果求a的3次方这样的函数,我们可以这样做
def func(a):
return a**3
re1=func(2)
print(re1) '''运行结果:8'''
那么,还有别的方法吗?
进入今天的主题——匿名函数
1、匿名函数
想实现函数的功能,不想给函数命名
lambda 参数:表达式
# lambda 参数:表达式
re2 = lambda b:b**3
print(re2) #运行结果:<function <lambda> at 0x0000000002567E50> 若不调用的话,打印的结果是函数体
print(re2(2)) #运行结果:8 需要调用才可以输出结果
前面还提到filter函数,可以过滤序列满足条件的元素,但是使用前需要先定义一个函数,那么有没有更简单的方法呢?
#filter(函数,序列)
#利用定义函数的方法
def func(x):
return x>10
li=[1,111,23,54,4,8,1,1,745,2,4,22,65,2] #列表
print(list(filter(func,li))) '''执行结果:[111, 23, 54, 745, 22, 65]'''
#利用匿名函数的方法
print(list(filter(lambda a:a>5,[1,2,4,5,7,88,9,6])))
从以上对比,定义函数的方法需要用4行语句,而用匿名函数的方法仅1行语句,这样可以大大提升程序的效率!
注意:
- lambda只是一个表达式,函数体比def简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
2、匿名函数参数
func = lambda x,y,z:x+y+z
print(func(2,5,9)) '''结果:16'''
#默认参数
func= lambda x='I',y=' Want',z=' You':x+y+z
print(func()) '''结果:I Want You'''
print(func(y=' Love')) '''结果:I Love You'''
3、lambda和普通的函数的区别:
1、匿名函数省去了定义过程,使得程序更简洁优化
2、匿名函数省去了对函数命名的过程,也避免了函数名冲突的问题
3、匿名函数不需要return来返回值,表达式本身就是返回值