• 匿名函数


    匿名函数

    一、有名函数

    之前定的函数都是有名函数,它是基于函数名使用。

    def func():
        print('from func')
    
    
    func()
    func()
    func()
    print(func)
    

    from func
    from func
    from func
    <function func at 0x10518b268>

    二、匿名函数

    匿名函数,他没有绑定名字,使用一次即被收回,加括号既可以运行。

    语法:

    lambda 参数列表 : 表达式

    说明

    1. 使用lambda关键字创建匿名函数。所谓匿名函数,就是没有名字的函数。
    2. 匿名函数冒号后面的表达式有且只能有一个,注意:是表达式,而不是语句。
    3. 匿名函数自带return,而return的结果就是表达式的计算后的结果。

    匿名函数调用

    步骤一:将创建好的匿名函数通过一个变量来去接收。

    步骤二:使用变量再去调用匿名函数。

    lambda x, y: x+y
    

    <function main.(x, y)>

    res = (lambda x, y: x+y)(1, 2)
    print(res)
    
    print((lambda: 1 + 1)())
    

    3

    2

    三、与内置函数联用

    匿名函数通常与max()、sorted()、filter()、sorted()方法联用。

    salary_dict = {
        'randy': 3000,
        'laowang': 100000,
        'bar': 5000,
        'cheer': 2000
    }
    

    3.1 max()

    如果我们想从上述字典中取出薪资最高的人,我们可以使用max()方法,但是max()默认比较的是字典的key。

    • 首先将可迭代对象变成迭代器对象

    • res=next(迭代器对象),将res当做参数传给key指定的函数,然后将该函数的返回值当做判断依据

    def func(k):
        return salary_dict[k]
    
    
    print(f"max(salary_dict, key=func()): {max(salary_dict, key=func)}")
    print(
        f"max(salary_dict, key=lambda name: salary_dict[name]): {max(salary_dict, key=lambda name: salary_dict[name])}")
    

    max(salary_dict, key=func()): ('laowang', 100000)
    max(salary_dict, key=lambda name: salary_dict[name]): ('laowang', 100000)

    3.2 sorted() 排序

    如果我们想对上述字典中的人,按照薪资从大到小排序,可以使用sorted()方法。

    1. 首先将可迭代对象变成迭代器对象
    2. res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值当做判断依据。
    lis = [1, 3, 2, 5, 8, 6]
    sorted(lis)
    print(f"lis: {lis}")
    print(f"sorted(lis,reverse=True): {sorted(lis,reverse=True)}")
    

    lis: [1, 3, 2, 5, 8, 6]
    sorted(lis,reverse=True): [8, 6, 5, 3, 2, 1]

    print(
        f"sorted(salary_dict, key=lambda name: salary_dict[name]):
        {sorted(salary_dict, key=lambda name: salary_dict[name])}" # 根据value来排序
    )
    

    sorted(salary_dict, key=lambda name: salary_dict[name]): ['cheer', 'randy', 'bar', 'laowang']

    3.3 map()

    如果我们想对一个列表中的工资加薪,可以使用map()方法。

    1. 首先将可迭代对象变成迭代器对象
    2. res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值作为map()方法的结果之一。
    print(list(map(lambda name: salary_dict[name] + 2000, salary_dict)),11)
    

    [5000, 102000, 7000, 4000]

    3.4 filter()

    如果我们想筛选除薪资小于5000,我们可以使用filter()方法。

    filter()工作原理:

    1. 首先将可迭代对象变成迭代器对象
    2. res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后filter会判断函数的返回值的真假,如果为真则留下。
    print(list(filter(lambda i: i[1] < 5000, salary_list)))
    print(list(filter(lambda name: salary_dict[name] < 5000, salary_dict)))
    

    [('randy', 3000), ('cheer', 2000)]

    ['randy', 'cheer']

    四、自定义sorted方法

    def sorted(iter, key=None, reverse=None):
        iter.sort()
    
        if key:
            # key 是一个函数对象
            lt = []
            lt2 = []
            for i in iter:
                res = key(i)
                lt.append(res)
                lt2.append(i)
            lt.sort()
    
            lt3 = []
            for i in lt:
                for j in lt2:
                    if j[1] == i:
                        lt3.append(j)
    
            if reverse:
                lt3.reverse()
            return lt3
    
        if reverse:
            iter.reverse()
        return iter
    
    
    salary_list = list(salary_dict.items())
    print(salary_list) 
    print(sorted(salary_list, key=lambda i: i[1], reverse=None))  
    

    五、总结

    1. 匿名函数:****lambda 参数列表 : 表达式,只可使用一次,一般和内置函数一起连用
    2. max():最大值,其中key参数为函数可以有名函数或匿名函数,都可以使用,key是对匿名函数的结果值获取最大值
    3. min(): 最小值,其中key参数为函数可以有名函数或匿名函数,都可以使用,key是对匿名函数的结果值获取最小值
    4. sorted: 排序,其中key参数为函数可以有名函数或匿名函数,都可以使用,key是对匿名函数的结果值进行排序
    5. **map: **数据统一处理,第一个参数为函数地址,第二个参数为可迭代对象,将匿名函数中表达式处理的结果返回,返回是一个对象需要list转换
    6. filter: 过滤器, 第一个参数为函数地址,第二个参数为可迭代对象,将匿名函数中表达式过滤满足条件的结果,进行返回返回,返回是一个对象需要list转换
    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    ubuntu 12.04 安装phpUnit
    composer 安装 ubuntu 12.04
    初学 Phreeze 4
    curl模拟文件post提交
    Phreeze Criteria的应用,在两个表里面查找多个符合条件的数据
    ubuntu 12.04 安装vim
    初学Phreeze 5 excel 表格,自动生成文件
    初学Phreeze 6,reporter文件
    //让程序在后台运行,即使关闭终端 仍可运行
    phpopenid中创建多级目录的方法
  • 原文地址:https://www.cnblogs.com/randysun/p/12242694.html
Copyright © 2020-2023  润新知