zoukankan      html  css  js  c++  java
  • python lambda表达式

    Lambda表达式

    Tags: Python


    lambda算是一个表达式,虽然它定义的是一个匿名函数,但其本身依然算是一个表达式。

    匿名函数主要用在需要一个函数,但又不想费神的去定义命名一个函数的场景下,在实际应用中往往带来的是代码逻辑的清晰与简洁。

    比如:在某种需求下,需要对一个list中的每个元素进行平方运算:

    当然可以使用列表表达式:

    data = [1, 2, 3]
    [x*x for x in data]
    

    不过这里不讨论列表表达式,如果用定义函数的方法呢就是:

    def sqrt(x):
        return x * x
    
    list(map(sqrt, [x for x in data]))
    

    这里是在一定范围内作用域内定义了一个函数,可能函数就只使用这一次,但依然需要定义一个全局函数,可能会导致环境污染。

    而如果使用匿名函数:

    list(map(lambda x: x*x, [x for x in data]))
    

    不需要为只使用一次的函数定义,只需要专注于逻辑实现,代码层面也比较清晰,不会再函数之间跳来跳去。

    匿名函数毕竟也是一个函数,所抽象出来的东西也是一组运算。和函数的用法有些区别但不大。
    比如,在python中可以这样:

    def sqrt(x):
        return x*x
    
    foo = sqrt
    foo(3) #返回9
    

    上述代码就是先声明一个函数sqrt(),之后将sqrt这个变量所指向的函数赋值给foo变量,之后就可以通过foo(3)调用函数。

    在Python中,函数名也是变量,其指向的是定义函数时的函数主体,也就是sqrt是一个变量,他代表的是sqrt()这个函数主体,赋值给foo,就是将函数主体赋值给foo变量,之后foosqrt的作用是一样的。

    也可以理解为:
    foo(3)是函数调用,foo是函数主体

    同样的使用lambda定义匿名函数时也可以这样:

    foo = lambda x: x*x
    foo(3) # 返回9
    

    也就可以看出lambda x: x*x实际上就是:

    def sqrt(x):
        return x*x
    

    lambda表达式中,冒号前面的x就是函数的参数,返回值就是表达式的结果。

    在python中,匿名函数有个限制就是只能有一个表达式,可能是为了避免过分的滥用导致代码晦涩难懂。

    同样也可以将匿名函数作为函数返回值返回,比如:

    def action(x):
        return lambda y: x+y
    
    a = action(2)
    a(20) # 返回22
    

    在这里a = action(2)的作用是将2赋值给参数x,之后的a就是一个函数,其函数体为:

    lambda y: 2+y
    

    所以a(20)的结果为22。
    也可以把def直接写成lambda形式:

    b = lambda x: lambda y: x+y
    a = b(3)
    a(2) # 返回5
    (b(2))(2) # 返回4
    

    官方文档的介绍:

    lambda表达式

    函数与lambda表达式

  • 相关阅读:
    在SSM框架中,multfile转file
    mysql 存储过程简单实例
    mysql 对比两个表的一致性
    Lucene 排序 Sort与SortField
    Lucene5.x 中文 同义词
    Lucene分页-----SearcherAfter
    Lucene的Query类介绍
    二叉树实例学习(四)——获取节点的高度函数getHight()
    二叉树实例学习(三)——插入左右节点函数测试
    二叉树实例学习(二)
  • 原文地址:https://www.cnblogs.com/tingyugetc/p/5750851.html
Copyright © 2011-2022 走看看