测开之函数进阶· 第4篇《匿名函数》
2020-12-29 20:50
337 查看
坚持原创输出,点击蓝字关注我吧
作者:清菡
博客: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 = (l 1044 ambda 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表达式用得多,三目运算符用得少。
三、精彩推荐
- 数据类型第 2 篇「字典和集合的原理和应用」
- 测开之数据类型· 第 3 篇《列表推导式、字典推导式、2 种方式创建生成器》
- 测开之数据类型· 第 4 篇《迭代器、生成器》
- 测开之函数进阶· 第 2 篇《纯函数》
- 函数进阶· 第 3 篇《常用内置函数 filter()、map()、zip(),怎么用的呢?》
公众号 清菡软件测试 首发,更多原创文章:清菡软件测试 113+原创文章,欢迎关注、交流,禁止第三方擅自转载。
相关文章推荐
- python之函数的匿名函数【进阶篇】
- 洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”
- PythonDay08(进阶)---函数式编程(二):匿名函数、装饰器详细介绍、偏函数
- Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
- Matlab 函数进阶:使用匿名函数和内嵌函数处理多变量传递问题(Matlab 7.0以上)
- 第12节:Scala函数式编程进阶(匿名函数,高阶函数,函数类型推断,currying柯里化)
- 大数据Spark“蘑菇云”行动-第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
- Matlab 函数进阶:使用匿名函数和内嵌函数处理多变量传递问题(Matlab 7.0以上)
- Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊
- 函数进阶· 第3篇《常用内置函数filter()、map()、zip(),怎么用的呢?》
- python 函数进阶:参数传递,高阶函数,lambda 匿名函数,global 变量,递归
- js进阶---匿名函数及函数闭包
- Python_函数进阶_参数类型_命名空间_作用域_全局局部变量_global和nonlcoal_内建函数_匿名函数_闭包_装饰器(8)
- Python基础学习笔记——函数(4):递归函数、匿名函数、高阶函数
- 苹果新的编程语言 Swift 语言进阶(六)--函数和闭包
- [李景山php] 深入理解PHP内核[读书笔记]--第四章:函数的实现 --匿名函数及闭包
- 函数的参数 , 不定长参数 , 万能函数 , 匿名函数 , zip函数 , 装饰器
- 【JS函数进阶】递归和堆栈
- 进阶指针与数组——函数指针,函数指针数组等
- xpinyin-函数返回多个值-lambda匿名函数-列表生成式-三元表达式