zoukankan      html  css  js  c++  java
  • (14)匿名函数

    什么是匿名函数

    匿名函数: 没有名字的函数,意味着只能用一次就被回收

    匿名函数用 lambda 表示

    为何用匿名函数:用于临时使用一次的功能

    匿名函数的定义格式

    lambda 参数,参数:表达式  #参数规则和有名函数是一样的

    lambda x,y:return x+y #这个位置的return是自带的,所以写表达式时候不需要写

    表达式解析:匿名函数 + 参数:表达式,将表达式的值用return返回

    PS:匿名函数自动有一个返回值,自带return,不能写return,也不能写语句,但是只要有返回值的表达式都可以写

    匿名函数的调用方式

    print(lambda x,y:x+y)(参数1,参数2)  

    PS:匿名函数都是与其他功能配合去一起用

    匿名函数实例

    salaries={

        'egon':3000,

        'alex':100000000,

        'wupeiqi':10000,

        'yuanhao':2000

        }  

    例:用倪匿名函数获取字典中工资最高的人的名字

      print(max(salaries,key=lambda k:salaries[k]))  #将匿名函数的返回值传递给key方法,告诉max方法对比的依据是什

    逻辑原理就是max先遵循迭代器协议,将salaries的key取出来,然后传给max里面的key这个参数,在通过key这个参数传给函数lamdb
    函数内的参数k,参数k再将参数传递给表达式,最后获取的值返回给key,max依据key参数做出判断

    例:用匿名函数获取字典中工资最低的人的名字

    print(min(salaries,key=lambda k:salaries[k]))

    例:用匿名函数将字典按照工资的小到大排序放入列表(比薪资取人名)

    res=sorted(salaries,key=lambda k:salaries[k],reverse=True) #sorted的reverse默认是False,如果是True就是反过来排序

    print(res)  

    例:用倪匿名函数获取字典中工资最大的并且取得这个数字

    print(max(salaries.values()))

    PS:max默认方法遵循迭代器协议,从字典中取出的值是key,迭代器协议是无法更改的

    PS:max方法里面有一个参数是key,这个key不是指字典的key,只是表示max方法的参数,这个key就是告诉max方法比较依据是什么,key一定要指向一个函数的内存地址

    匿名函数配合冷门方法,需要了解:

    map() #就是映射的意思

    就是有多个值,每个值按照一个映射规则,产生一个新的值

    map(func,iter)有两个参数,第一个就是映射规则,另一个就是可迭代对象

    例:把一个列表按照映射规则映射成一个新的值

    names=['alex','oldboy','kevin','hxx']  #名字列表

    res=map(lambda item:item+'_SB',names)

    print(list(res))

    map可以用列表生成式代替(所以这个方法基本不会用到)

    print((name+'_SB' for name in names)) #列表生成器表达式

    PS:map的底层原理就是一个for循环一样的原理,将一个列表变成迭代器对象,然后next一个值,将值传给前面的函数做系列运算,然后将函数的返回值当做映射之后的值

    PS:python2中直接将值全部映射成一个新值放入内存中,python3中直接就是一个迭代器(更省空间)

    reduce #就是合并的意思

    列:从1-100的数相加

    from functools import reduce

    res=reduce(lambda x,y:x+y,range(1,101))

    print(res)

    PS:reduce里面有一个初始值sequence,如果不指定就会取range里面的第一个值作为初始值,先将可迭代对象变成迭代器对象,然后next一次取得一个值传递给前面的函数,然后与初始值相加做运算,得到一个新值作为初始值,然后又next一次得到值与初始值相加,直到加到最后一个值

    例:合并字符串

    l=['a','b','c','d']

    res=reduce(lambda x,y:x+':'+y,l)

    print(res)

    PS:逻辑原理同上面的整数相加

    print(':'.join(l))

    合并字符串可以用join方法替代

    print(':'.join(l))

    filter #过滤

    filter有两个参数,一个就是过滤规则,另一个就是可迭代对象

    names=['alex_sb','egon','kevin_sb','oldboy_sb']

    res=filter(lambda x:x.endswith('sb'),names)

    print(list(res))

    filter可以用列表表达式替代

    print([name for name in names if name.endswith('sb')])

    PS:逻辑原理就是filter将names列表变成迭代器,next一次然后取出一个值,传递给前面的lanbda函数,lambda函数取得值后传入后面的运算式,然后返回结果,依次直到再也取不到值则结束

  • 相关阅读:
    IDEA tomcat热部署方法及乱码问题解决
    访问WEB-INF下JSP资源的几种方式(转)
    SpringMVC 静态资源处理
    SpringMVC中的拦截器
    SpringMVC中的异常处理
    SpringMVC实现文件上传
    IDEA 热部署
    响应数据和结果视图
    SpringMVC中的常用注解
    js获取当前根目录的方法
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10016012.html
Copyright © 2011-2022 走看看