• 22.python匿名函数详解


    匿名(lambda)函数:

    作用:创始一个匿名函数对象,同 def 类似,但不提供函数名,只是一个表达式,lambda比函数简单且可以随时创建和销毁,有利于减少程序的偶合度。lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。

    语法格式:lambda [函数形参列表]: 表达式

    lambda [arg1 [,arg2,.....argn]]:expression

    【注意】:

    1) . lambda 表达式创建的函数只能包含一条表达式;

    2) . 由于lambda函数返回的是函数对象(构建的是一个函数对象),所以需要定义一个变量去接收,即匿名函数同样需要被调用才能执行,调用仍然使用()传参的方式实现;

    3) . 匿名函数同样可以定义有返回值没有返回值,有参数没有参数的情况。

    代码演示演示匿名函数的定义和使用(与有名函数对比):    

     1 # 定义无参有返回值的有名函数:
     2 def func():
     3     return True
     4 # 调用有名函数执行
     5 print(func())             # True
     6 
     7 # 定义无参有返回值的匿名函数:
     8 f = lambda : False
     9 # 调用匿名函数执行
    10 print(f())                # False
    11 
    12 # 定义无参无返回值的有名函数:
    13 def func():
    14     print(True)
    15 # 调用有名函数执行
    16 func()                    # True
    17 
    18 # 定义无参无返回值的匿名函数:
    19 f = lambda : print(False)
    20 # 调用匿名函数执行
    21 f()                       # False

    分类匿名函数 --> 以参数进行:
    1). 1个参数
    2). 多个参数
    3). 默认参数
    4). 可变参数

     1 # 先定义有名函数
     2 def m1(a):
     3     return a ** 2
     4 
     5 def m2(a,b):
     6     return a + b
     7 
     8 def m3(s1,s2='hello'):
     9     return s1 + s2
    10 
    11 print(m1(3))        # 9
    12 print(m2(10,20))    # 30
    13 print(m3('北京'))   # 北京hello
    14     
    1 # 定义匿名函数的形式以及调用
    3 print((lambda x: x ** 2)(3))   # 相当于f=lambda x:x**2 ---》Print(f(3))
    4 print((lambda x,y: x + y)(10,20))  # f=lambda x,y:x+y ---》print(f(10,20))
    5 print((lambda s1,s2='hello,': s2 + s1)('老郭')) 
    6 
    7 # 匿名函数的可变参格式
    8 print((lambda *x: x)('UI','H5','JS','PHP','软件测试','网络营销')) #得到('UI', 'H5', 'JS', 'PHP', '软件测试', '网络营销')
    9 print((lambda **y: y)(name='zs',age=18)) #得到{'name': 'zs', 'age': 18}

    代码演示示例:

     1 # 需求1:将字符串数据'this is 
    a 	test' -->得到 'this is a test'
     2 
     3 # 不使用匿名函数   
     4 str1 = 'this is 
    a 	test'
     5 lt = str1.split()
     6 str2 = ' '.join(lt)
     7 print(str2,type(str2))       # 得到this is a test <class 'str'>
     8 
     9 # 使用匿名函数
    10 f = lambda x:' '.join(x.split())
    11 print(f(str1))
    12 # 匿名函数精简版
    13 print((lambda x: ' '.join(x.split()))(str1))
    14 
    15 
    16 # 需求2:使用匿名函数实现得到两个数中的较大值
    17 my_max = lambda x,y: x if x > y else y
    18 # 调用匿名函数执行
    19 print(my_max(10,20))         # 得到20
    20 
    21 
    22 # 需求3:演示有名函数和匿名函数嵌套使用情况
    23 # 示例(1)
    24 def test(a,b,func):
    25     result = func(a,b)
    26     return result
    27 # 调用函数
    28 num = test(11,22,lambda x,y:x+y)
    29 print(num)
    30 
    31 # 示例(2)
    32 def speak(content):
    33     return (lambda x: x + '你好')(content)
    34 print(speak('北京'))

    代码演示匿名函数配合容器类型使用:

     1 # 1.匿名函数配合列表对象使用
     2 lt = [lambda x:x ** 2,lambda x:x ** 3,lambda x:x ** 4]
     3 for i in lt:             # 遍历lt对象
     4     print(i(2))          # 得到 4  8  16
     5  
     6 # 单独获取某一个元素并且执行
     7 print(lt[-1](3))         # 得到81
     8 
     9 # 2.匿名函数配合字典对象使用
    10 dic1 = {'A':lambda :2*2,'B':lambda :3*3,'C':lambda :4*4}
    11 print(dic1['C']())       # 得到16
    12 
    13 # 3.列表嵌套字典,按照身高进行排序显示(降序)
    14 dic2 = [
    15         {'name':'张学友','age':56,'height':173.0},
    16         {'name':'刘德华','age':55,'height':176.0},
    17         {'name':'郭富城','age':54,'height':170.0},
    18         {'name':'黎明','age':57,'height':181.0},
    19 ]
    20 dic2.sort(reverse=True,key=lambda x:x['height'])    # 相等于 sorted(reverse=Ture,key=lambda x:x['height'])
    21 print(dic2)

    【补充】:sorted()sort()函数的区别

    相同点:它们都是来实现排序的操作(功能层面)

    不同点:sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。列表中的sort函数,它执行完毕后会直接影响原本这个list的内部结构(内部的数据发生改变了);而内置函数sorted函数,它执行完毕后不会影响原本容器中的内部结构,而会返回一个新的列表给程序。list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

    sorted()函数:

    语法:sorted(iterable[, cmp[, key[, reverse]]])

    参数:
    iterable -- 可迭代对象
    cmp -- 比较的函数,有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0
    key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序
    reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)

    返回值:返回重新排序的列表

    代码演示示例:

     1 lt = [42,-9,0,-11,67,92,100,-33]
     2 print(lt.sort())      # None
     3 print(lt)               # [-33, -11, -9, 0, 42, 67, 92, 100], lt变化了   
     4 lt = [42,-9,0,-11,67,92,100,-33]
     5 lt1 = sorted(lt)
     6 print(lt1)             # [-33, -11, -9, 0, 42, 67, 92, 100], 
     7 print(lt)               # [42, -9, 0, -11, 67, 92, 100, -33], lt没有变
     8 
     9 # 元祖进行sorted操作
    10 tp = (42,-9,0,-11,67,92,100,-33)
    11 lt1 = sorted(tp)           # 得到的仍然是list对象
    12 print(lt1,type(lt1))       # [-33, -11, -9, 0, 42, 67, 92, 100] <class 'list'>
    13 print(lt)                      # (42, -9, 0, -11, 67, 92, 100, -33),tp没有变
    14 
    15 lt = [42,-9,0,-11,67,92,100,-33]
    16 lt1 = sorted(r,reverse=True)     #reverse=True表示降序
    17 print(lt1,type(lt1))           #[100, 92, 67, 42, 0, -33, -11, -9] <class 'list'>
    18 
    19 #这里的思想和高阶函数思想很像,key=abs相当于取每个数的绝对值
    20 lt = [42,-9,0,-11,67,92,100,-33]
    21 lt2 = sorted(lt,key=abs,reverse=True)   
    22 print(lt2)         #[100, 92, 67, 42, -33, -11, -9, 0]
    23 
    24 lt3 = ['aaaaa','bbb','ccccccc','d']
    25 lt4 = sorted(lt3,key=len,reverse=True)    key=len相当于取每个数的长度
    26 print(lt4)        #['ccccccc', 'aaaaa', 'bbb', 'd']


  • 相关阅读:
    springboot 集成 SMTP 发送邮件
    springmvc的controller中使用@Transactional无效
    Apache POI Java Excel easypoi
    java import和import static的区别
    ave an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IS
    未能加载文件或程序集“System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或它的某一个依赖项
    matlab练习索引
    matlab练习程序(DWA)
    matlab练习程序(解西尔维斯特、李雅普诺夫方程)
    matlab练习程序(NDT)
  • 原文地址:https://www.cnblogs.com/bonheur/p/12386868.html
Copyright © 2020-2023  润新知