测开之函数进阶· 第 4 篇《匿名函数》

用户头像
清菡
关注
发布于: 2020 年 12 月 29 日
测开之函数进阶· 第4篇《匿名函数》

坚持原创输出,点击蓝字关注我吧





作者:清菡

博客:oschina、云+社区、知乎等各大平台都有。



由于微信公众号推送改为了信息流的形式,防止走丢,请给加个星标 ⭐,你就可以第一时间接收到本公众号的推送!



目录



  • 一、匿名函数

- 1.匿名函数格式

- 2.匿名函数适用的场景

- 3.如何调用 lambda 函数

- 4.运算符的优先级

- 5.用 lambda 实现过滤

- 6.在列表推导式中怎么用?

  • 二、三目运算符

  • 三、精彩推荐



一、匿名函数



Python 中有一种特殊的函数,不需要使用def去定义,也不用给函数起名字。用lambda表达式来定义,这种函数叫做匿名函数。



1.匿名函数格式



lambda 参数:表达式(返回值)



lambda定义函数和def定义函数的时候,格式是不一样的。



这个匿名函数lambda a,b:a+b和这个普通函数:



def func(a,b):
return a+b



效果是一样的。



def后面跟着函数名字func()lambda后面是没有函数名字的,直接写参数,参数后面是个冒号。冒号后面的a+b就是个返回值。



2.匿名函数适用的场景



简单的函数定义(只有一个表达式)。



例如普通函数:



def func(a,b):
c = a+b
print(c)
return a+b



这个函数里面有多条语句,这种的话就不适用于这个匿名函数lambda a,b:a+b语句。



lambda只有一条return的内容。return根据参数进行相关操作,进行返回。



3.如何调用 lambda 函数



错误方式一:



lambda a,b:a+b(11,22)





没看到输出结果。其实是调用了,只是你没看到。调用完毕后,返回值需要接收一下。



这样是调用不了的:



res = lambda a,b:a+b(11,22)
print(res)



打印一个 lambda 函数对象:





lambda a,b:a+b这块是个匿名函数,lambda a,b:a+b(11,22)这样写,会把a+b(11,22)全部当作一个表达式。



res = lambda a,b:a+b(11,22)
print(res(11,22))



这时候运行就会报错:





报错提示:int对象没有调用的方法。



错误方式二:



还有,这种写法定义函数,也不会去用:



f=lambda a:a*9
f(10)





匿名函数讲究即用即释放,就是定义这个函数,使用完毕后,内存里面就释放这个内存了。



因为没有任何变量指向这个函数,所以内存就马上释放了,可以节约内存。



定义完毕后:



f=lambda a:a*9
f(10)



f 就相当于一个函数名了,调用完毕后,再想用这个 f, 还是可以够得到的。那这个函数始终都存在内存里面了。



正确调用方式:



res = lambda a,b:a+b
print(res(11,22))





4.运算符的优先级



如果分不清哪个先用,哪个后用,可以加个括号把它扩起来:



(lambda a,b:a+b)(1,2)



res = (lambda a,b:a+b)(1,2)
print(res)





通过lambda直接定义直接调用,例如(lambda a,b:a+b)(1,2)(lambda a,b:a+b)调用完毕后,马上从内存里给删除掉了,立马释放内存。



5.用 lambda 实现过滤



lambda 用的最多的是在 filter()zip()函数。



li = [1, 2, 122, 331, 11, 22, 33, 4, 6, 7, 2, 88, 31]
res2=filter(lambda x:x<10,li)
print(list(res2))



这样就实现了一个快速的过滤,之前还要定义一个函数,这样写更加节省内存,而且语法更加舒适:





x<10的都保留下来,当然你也可以修改成x<33或者其它的,具体看列表里面的元素,设置的条件不一样,输出的结果就不同。



res2=filter(lambda x:x<10,li)中过滤条件是lambda x:x<10,后面传可迭代对象li



6.在列表推导式中怎么用?



生成 10 个数:



li2=[(lambda x:x%5==0)(i) for i in range(10)]
print(li2)



lambda x:x%5==0这是个lambda的表达式,需要个x的参数,是能够被 5 整除的意思。





二、三目运算符



a=100
if a>100:
print(100)
else:
print(22)



写成三目运算符是这样:



print(100) if a>100 else print(22)



三目运算符适用于条件成立的时候做什么事情,条件不成立的时候做什么事情。有些很简单的条件控制,通过这种方式来做。



lambda一样,可以简化代码。原来需要定义这个函数,再传进去,通过lambda表达式也可以把函数直接写在那行代码里面了,不需要去单独去定义函数了。lambda表达式用得多,三目运算符用得少。



三、精彩推荐








公众号 清菡软件测试 首发,更多原创文章:清菡软件测试 113+原创文章,欢迎关注、交流,禁止第三方擅自转载。



发布于: 2020 年 12 月 29 日阅读数: 8
用户头像

清菡

关注

公众号《清菡软件测试》作者,热爱技术。 2019.10.29 加入

热爱技术,喜欢英语。

评论

发布
暂无评论
测开之函数进阶· 第4篇《匿名函数》