大家好,欢迎来到IT知识分享网。
目录
前言
什么是匿名函数?匿名函数的应用场景?匿名函数的实现方式?
1、匿名函数的定义
匿名函数就是没有名字的函数,它主要应用在需要一个函数、但是后面又不会在需要,更不想费神去命名这个函数的场合。通常情况下,这样的函数只使用一次。
2、匿名函数的语法格式
name = lambda [arg1 [,arg2,...,argn]]:expression
相关参数如下:
name:用于调用lambda表达式。
[arg1 [,arg2,…,argn]]:可选参数,用于指定要传递的参数列表,多个参数间使用逗号“,”分隔。
expression:必选参数,用于指定一个实现具体功能的表达式。如果有参数,那么在该表达式中将应用这些参数。
3、实现方式
需求:将下列的有名函数改为匿名函数并调用
# 有名函数 def func(x, y): return x + y
- 定义匿名函数,则不能再用def,因为def后面必须跟一个函数名。
- 定义匿名函数需要用到一个新的关键字——lambda。
步骤一:定义匿名函数
# 1.lambda 关键字后面直接跟函数的参数 # 2.在写的过程中我们直接给参数赋值也是可以的例如:y=1 # 3.参数写完之后我们在后面写冒号 # 4.写完之后我们直接在参数后面写子代码就可以了 # 5.函数的子代码是一个return返回值, # 6.我们直接去掉return写返回值就可以了 lambda x, y=1: x + y
步骤二:调用匿名函数
- 前面我们定义函数都有一个函数名,相当于把定义好的函数内存地址赋值给了函数名,这样我们就可以通过函数名来访问函数。
- 匿名函数没有名字,但是也会有内存地址,我们试着print一下看看。
print(lambda x, y=1: x + y) >>>输出结果: <function <lambda> at 0x00000286F58FE438> # 可以看到这是一段函数地址 Process finished with exit code 0
- 既然如此我们想对其进行调用就很简单了,直接在后面加()就行,然后又参数的时候我们就给它传参。比如1,2。
- 但是现在有一个问题,直接在y 后面传参的话 就会被识别成:y(1, 2)。所以我们一个先用括号将前面的函数整体给区分开来。现在运行一下结果是怎么样的。
(lambda x, y=1: x + y)(1, 2) >>>输出结果: Process finished with exit code 0
- 运行结果什么都没有,因为这个函数子代码只是做了x+y这个运算,函数内部并没有任何操作,最后它吧运算结果返回了出来,也就是说这个函数调用完之后还有一个返回值,故此我们可以print一下试试看。
print((lambda x, y=1: x + y)(1, 2)) # 因为上面的y我们给了一个默认值,所以我们可以只传一个参数给它再运行试试看 print((lambda x, y=1: x + y)(1)) >>>输出结果: 3 2 Process finished with exit code 0
- 故此就实现了匿名函数的调用了。
4、匿名函数的应用拓展
(1)操作型匿名函数
引用上面的代码,将子代码改为类似于print的可操作的匿名函数。
print((lambda x, y=1: print(x + y))(1)) # 因为函数没有返回值,所以最外层print的时候结果为None >>>输出结果: 2 None Process finished with exit code 0
(2)单条件匿名函数
# 如果x>y输出x,否则输出y print((lambda x, y=1: x if x > y else y)(3)) print((lambda x, y=1: x if x > y else y)(3, 6)) >>>输出结果: 3 6 Process finished with exit code 0
(3)多条件匿名函数
# 如果x>y输出x,x<y输出y,否则两个都输出 print((lambda x, y=1: x if x > y else y if x < y else f'{x} {y}')(3)) print((lambda x, y=1: x if x > y else y if x < y else f'{x} {y}')(3, 6)) print((lambda x, y=1: x if x > y else y if x < y else f'x={x} y={y}')(1)) >>>输出结果: 3 6 x=1 y=1 Process finished with exit code 0
(4)多返回值匿名函数
在(3)中 我们返回两个值时是直接用了f表达式将两个值整合为一个字符串整体,那能不能直接不加修饰返回两个值呢?
# 如果x>y输出x,x<y输出y,否则两个都输出 print((lambda x, y=1: x if x > y else y if x < y else x, y)(1)) >>>输出结果: Traceback (most recent call last): File "D:/1017-test.py", line 2, in <module> print((lambda x, y=1: x if x > y else y if x < y else x, y)(1)) NameError: name 'y' is not defined Process finished with exit code 1
- 很明显,报错了。给出的信息是”name ‘y’ is not defined“也就是说我们的y还没有被定义。但是我们在写参数的时候就已经给了y一个默认值,为什么还会说我们未定义呢?
- 其实这就是匿名函数和有名函数的区别。匿名函数特性是在得到第一个返回值的时候就会把变量的内存释放,无法得到第二个返回值,因此得出的结论是,匿名函数的返回值在不加修饰的情况下 无法直接返回两个或多个值。
5、匿名函数的优点
- 使用Python写一些脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。
- 对于一些抽象的,不会被别的地方再重复使用的函数,有时候函数起个名字也是个难题,使用lambda不需要考虑命名的问题。
- 使用lambda在某些时候然后代码更容易理解。
示例:求一个两个函数之和的函数
有名函数定义和调用:
def add(x, y): return x + y print(add(1, 2)) >>>输出结果: 3 Process finished with exit code 0
匿名函数定义和调用:
print((lambda x, y: x + y)(1, 2)) # 或者可以这样写 add = lambda x, y: x + y print(add(1, 2)) >>>输出结果: 3 3 Process finished with exit code 0
6、有名函数和匿名函数的区别
- 匿名函数不适用于需要重复调用的场景,而是需要一个只需要临时使用一次的功能。
- 有名函数:需要被重复调用。
- 匿名函数:临时调用一次,匿名函数一般和其他函数配合使用,且只能直接返回一个返回值。
声明:以上内容仅供学习交流,如有错误欢迎指正!!!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120916.html