python lambda函数

作者: 小董不太懂 | 来源:发表于2019-07-19 19:32 被阅读0次

    lambda

    是匿名函数 用来表达简单的函数
    使用lambda函数应该注意的几点:

    • lambda定义的是单行函数,如果需要复杂的函数,应该定义普通函数
    • lambda参数列表可以包含多个参数,如 lambda x, y: x + y
    • lambda中的表达式不能含有命令,而且只限一条表达式
    • 默认返回表达式中的计算结果
    • 可变类型的方法【基本】不会形成新的数据,只会在原始数据上修改,所以这些方法只有默认None返回值

    lambda表达式

    用于表示简单的函数:func1 = lambda 参数:一句话函数体(默认返回函数体内执行的内容)

    1.1 结构

    func=lambda a1,a2 : a1+100
    val=func(1,2)
    print(val)
    #返回101
    #不可变类型变化后形成新的字符串-->lambda内部默认返回执行后的值
    
    #原理类似:
    def func(a1,a2):
      return a1+100
    

    1.2 参数变化(0个到多个)

    func1=lambda :100#可不写参数
    func2=lambda a1:a1*10
    func3=lambda *args,**kwargs:len(args)+len(kwargs)#接收任意参数
    

    1.3 参数变量规则

    • lambda内部不能创建变量,只能调用自己的形参
    • 和函数查找规则一样:优先自己>>>父级查找>>>全局
    DATA=100
    func4=lambda a1:a1+DATA
    v=func4(1)
    print(v)#101
    
    DATA=100
    def func():
      DATA=1000
        func4=lambda a1:a1+DATA
        v=func4(1)
        print(v)#1001
    func()
    

    1.4 函数体内返回值注意事项

    • 不可变数据类型的方法会有返回值,因为原始数据不能修改,只能形成一个新的值
    • 可变类型的方法【基本】不会形成新的数据,只会在原始数据上修改,故这些方法只有默认None返回值
    • 但是集合中的集合运算(交并集等),会形成新的数据,即就是会有返回值
    #可变类型
    info=[]
    def func(X):
      v=info.append(X)
      return v
    print(func("gao"))
    #None
    #split/intersection/union 等同理
    
    #不可变类型
    def func1(x):
      v=x.strip()
      return v
    print(func("gao  "))#gao  没有空格
    
    什么是可变数据类型什么是不可变数据类型,见下表: 可变和不可变数据类型

    举几个小例子:

    func1=lambda info:info.split("a")
    print(func1("gao"))
    **********************************
    ['g', 'o']
    

    info.split("a")返回的数据类型是是str显然为不可变数据类型,故可以产生新数据,所以不会为None

    info=[]
    func1=lambda info:info.append("a")
    print(func1("gao"))
    
    输出结果

    这个显然就无法运行通过,因为info.append("a"),返回的数据类型是[]显然列表是可变数据类型,无法产生新的数据

    info=[]
    func4=lambda a1:info.append(a1)
    print(func4(4))
    ********************************
    D:\anaconda\python.exe D:/bilibili大学/简书代码/推导式.py
    None
    
    Process finished with exit code 0
    

    显然返回的数据类型也是列表,故为None

    1.5 和三元运算符的结合

    func5=lambda n1,n2:n1 if n1>n2 else n2
    v=func5(111,2)
    print(v)
    ***************************
    D:\anaconda\python.exe D:/bilibili大学/简书代码/推导式.py
    111
    
    Process finished with exit code 0
    

    1.6 列表中的lambda函数表达式

    func_list=[lambda x:x.strip(),lambda y:y+199,lambda x,y:x+y]
    print(func_list[0]("gao  "))#gao
    print(func_list[1](1))#200
    
    
    *********************************************
    
    func_list=[lambda x:x.strip(),lambda y:y+199,lambda x,y:x+y]
    print(func_list[0]("gao  "))#gao
    print(func_list[1](1))#200
    
    

    注意:

    lambda 和作用域考点 【子作用域默认不会对父级作用域的值进行重新赋值】

    def func():
      for num in range(10):
           pass
      #print(num) 我们尝试在这边加了一句,为了证明num = 9
       v4 = [lambda :num+10,lambda :num+100,lambda :num+100,]
       result1 = v4[1]()
       result2 = v4[2]()
       print(result1,result2)
    func()
    **************************************************
    D:\anaconda\python.exe D:/bilibili大学/简书代码/推导式.py
    109 109
    

    分析:第二行for循环,已经将num循环了一遍,并最终将num赋值为9


    lambda函数的介绍到此为止,我们不妨进行一些习题练习,加深掌握:

    口算题:(先口算然后运行验证)

    result = []
    for i in range(10):
        func = lambda : i      # 注意:函数不执行,内部代码不会执行。
        result.append(func)
    # 这段代码最后相当于result = [lambda : i,lambda : i,lambda : i,.....]
    # 因为lambda函数内部不能创建变量只能调用形参,而本段并未调用
    # i就一直为9
    print(i)#9
    print(result)#10个不同地址
    v1 = result[0]()#9 全局i 函数执行的时候 查找的是全局的i
    v2 = result[9]()#9
    print(v1,v2)
    
    v5=[lambda:100 for i in range(10)]
     v5[0]()#100
    *************************************************
     v5=[lambda:100+i for i in range(10)]
     v5[0]()#109     匿名函数没有马上执行  但是 i是全局变量在函数执行的时候i已经变成9
    

    这两道题与第一题大同小异。

    v5=[lambda:100 for i in range(10)]
     v5[0]()#100
     *************************************************
     v5=[lambda:100+i for i in range(10)]
     v5[0]()#109     匿名函数没有马上执行  但是 i是全局变量在函数执行的时候i已经变成9
     *************************************************
     v5=[lambda x:x*i for i in range(10)]
     print(v5[0](2))   #18
    

    相关文章

      网友评论

        本文标题:python lambda函数

        本文链接:https://www.haomeiwen.com/subject/qcsslctx.html