Python-匿名函数

目录

前言

1、匿名函数的定义

2、匿名函数的语法格式

3、实现方式

4、匿名函数的应用拓展

5、匿名函数的优点

6、有名函数和匿名函数的区别


前言

什么是匿名函数?匿名函数的应用场景?匿名函数的实现方式?

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)

>>>输出结果:
 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 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 else y if x < y else x, y)(1))

>>>输出结果:
Traceback (most recent call last):
  File "D:/1017-test.py", line 2, in 
    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、有名函数和匿名函数的区别

  • 匿名函数不适用于需要重复调用的场景,而是需要一个只需要临时使用一次的功能。
  • 有名函数:需要被重复调用。
  • 匿名函数:临时调用一次,匿名函数一般和其他函数配合使用,且只能直接返回一个返回值。

声明:以上内容仅供学习交流,如有错误欢迎指正!!!

你可能感兴趣的:(1024程序员节,python,开发语言,前端,后端)