您的位置:首页 > 其它

测开之函数进阶· 第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
    表达式用得多,三目运算符用得少。

    三、精彩推荐

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

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐