目录

前言

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)
    
    >>>输出结果:
    <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、有名函数和匿名函数的区别

  • 匿名函数不适用于需要重复调用的场景,而是需要一个只需要临时使用一次的功能。
  • 有名函数:需要被重复调用。
  • 匿名函数:临时调用一次,匿名函数一般和其他函数配合使用,且只能直接返回一个返回值。
  • 声明:以上内容仅供学习交流,如有错误欢迎指正!!!

    作者:IT菜dog

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python-匿名函数

    发表回复