zoukankan      html  css  js  c++  java
  • 078 匿名函数

    一、有名函数

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

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

    func()
    func()
    func()
    print(func)

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

    二、匿名函数

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

    lambda x, y: x+y
    
    <function __main__.<lambda>(x, y)>
    
    res = (lambda x, y: x+y)(1, 2)
    print(res)
    
    3
    

    三、与内置函数联用

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

    54匿名函数-薪资.jpg?x-oss-process=style/watermark

    salary_dict = {
        'nick': 3000,
        'jason': 100000,
        'tank': 5000,
        'sean': 2000
    }
    

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

    1. 首先将可迭代对象变成迭代器对象
    2. res=next(迭代器对象),将res当做参数传给key指定的函数,然后将该函数的返回值当做判断依据
    salary_dict = {
        'nick': 3000,
        'jason': 100000,
        'tank': 5000,
        'sean': 2000
    }
    

    print(f"max(salary_dict): {max(salary_dict)}")

    def func(k):
    return salary_dict[k]

    print(f"max(salary_dict, key=func()): {max(salary_dict, key=func)}")
    # 'nick', v1 = func('nick')
    # 'jason', v2 = func('jason')
    # 'tank', v3 = func('tank')
    # 'sean', v4 = func('sean')

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

    max(salary_dict): tank
    max(salary_dict, key=func()): jason
    max(salary_dict, key=lambda name: salary_dict[name]): jason
    

    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]
    
    salary_dict = {
        'nick': 3000,
        'jason': 100000,
        'tank': 5000,
        'sean': 2000
    }
    

    print(
    f"sorted(salary_dict, key=lambda name: salary_dict[name]): {sorted(salary_dict, key=lambda name: salary_dict[name])}")

    sorted(salary_dict, key=lambda name: salary_dict[name]): ['sean', 'nick', 'tank', 'jason']
    

    3.如果我们想对一个列表中的某个人名做处理,可以使用map()方法。

    map()工作原理:

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

    54匿名函数-傻逼.jpg?x-oss-process=style/watermark

    name_list = ['jason', 'tank', 'sean']
    

    res = map(lambda name: f"{name} sb", name_list)
    print(f"list(res): {list(res)}")

    list(res): ['jason sb', 'tank sb', 'sean sb']
    

    4.如果我们想筛选除名字中含有'sb'的名字,我们可以使用filter()方法。

    filter()工作原理:

    1. 首先将可迭代对象变成迭代器对象
    2. res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后filter会判断函数的返回值的真假,如果为真则留下。
    name_list = ['nick', 'jason sb', 'tank sb', 'sean sb']
    

    filter_res = filter(lambda name: name.endswith('sb'), name_list)
    print(f"list(filter_res): {list(filter_res)}")

    list(filter_res): ['jason sb', 'tank sb', 'sean sb']
    

    四、自定义sorted方法

    # 不太熟悉的同学不要看(有兴趣的可以看一看)
    def sorted(iter, key=None, reverse=None):
        iter.sort()
    
    <span class="hljs-keyword">if</span> key:
        <span class="hljs-comment"># key 是一个函数对象</span>
        lt = []
        lt2 = []
        <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">iter</span>:
            res = key(i)
            lt.append(res)
            lt2.append(i)
        lt.sort()
    
        lt3 = []
        <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> lt:
            <span class="hljs-keyword">for</span> j <span class="hljs-keyword">in</span> lt2:
                <span class="hljs-keyword">if</span> j[<span class="hljs-number">1</span>] == i:
                    lt3.append(j)
    
        <span class="hljs-keyword">if</span> reverse:
            lt3.reverse()
        <span class="hljs-keyword">return</span> lt3
    
    <span class="hljs-keyword">if</span> reverse:
        <span class="hljs-built_in">iter</span>.reverse()
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">iter</span>
    

    salary_list = list(salary_dict.items())
    print(salary_list) # [('nick', 3000), ('jason', 100000), ('tank', 5000), ('sean', 2000), ('z', 1000)]
    print(sorted(salary_list, key=lambda i: i[1],
    reverse=None)) # [('sean', 2000), ('nick', 3000), ('tank', 5000), ('jason', 100000)]

    五、习题

    '''
    1. 文件内容如下,标题为:姓名,性别,年纪,薪资
    
    姓名,性别,年纪,薪资
    nick male 18 3000
    ajson male 38 30000
    sean female 28 20000
    tank female 28 10000
    </span></code></pre>
    <p>要求:<br>
    从文件中取出每一条记录nick male 18 3000放入列表中,<br>
    列表的每个元素都是<code>{'name':'nick','sex':'male','age':18,'salary':3000}</code>的形式</p>
    <ol>
    <li>根据1得到的列表,取出薪资最高的人的信息</li>
    <li>根据1得到的列表,取出最年轻的人的信息</li>
    <li>根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式</li>
    <li>根据1得到的列表,过滤掉名字以a开头的人的信息</li>
    </ol>
    <p>'''</p>
    <p>user_info_list = []<br>
    with open('user_info.txt', 'r', encoding='utf8') as fr:<br>
    for user_info in fr:  # type:str<br>
    # print(user_info.strip().split(' '))<br>
    user_info_split = user_info.strip().split(' ')<br>
    name, sex, age, salary = user_info_split<br>
    user_info_dict = {'name': name, 'sex': sex, 'age': age, 'salary': salary}<br>
    # user_info_dict = {'name':user_info_split[0],'sex':user_info_split[1],'age':user_info_split[2],'salary':user_info_split[3]}<br>
    # user_info_dict = {k: v for k, v in zip(['name', 'sex', 'age', 'salary'], user_info_split)}<br>
    user_info_list.append(user_info_dict)</p>
    <h1 id="for-i-in-user_info_list">for i in user_info_list:</h1>
    <h1 id="printi">print(i)</h1>
    <p>'''</p>
    <ol>
    <li>根据1得到的列表,取出薪资最高的人的信息</li>
    <li>根据1得到的列表,取出最年轻的人的信息</li>
    <li>根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式</li>
    <li>根据1得到的列表,过滤掉名字以a开头的人的信息</li>
    </ol>
    <p>[<br>
    {'name': 'nick', 'sex': 'male', 'age': '18', 'salary': '3000'}<br>
    {'name': 'ajson', 'sex': 'male', 'age': '38', 'salary': '30000'}<br>
    {'name': 'sean', 'sex': 'female', 'age': '28', 'salary': '20000'}<br>
    {'name': 'tank', 'sex': 'female', 'age': '28', 'salary': '10000'}<br>
    ]<br>
    '''</p>
    <h1 id="1">1.</h1>
    <p>print(max(user_info_list, key=lambda item: item['salary']))<br>
    max_salary = 0<br>
    user_info_str = ''<br>
    for user_info in user_info_list:<br>
    if int(user_info['salary']) &gt; max_salary:<br>
    max_salary = int(user_info['salary'])<br>
    user_info_str = user_info<br>
    print(1, user_info_str)</p>
    <h1 id="2">2.</h1>
    <p>print(min(user_info_list, key=lambda item: item['age']))</p>
    <h1 id="3">3.</h1>
    <p>print(list(map(lambda item: item['name'].title(), user_info_list)))</p>
    <h1 id="4">4.</h1>
    <h1 id="printlistfilterlambda-item-notitemnamestartswitha-user_info_list">print(list(filter(lambda item: not(item['name'].startswith('a')), user_info_list)))</h1>
    <h1 id=""></h1>
    <p>for user_info in user_info_list:  # type:dict<br>
    if user_info['name'].startswith('a'):<br>
    user_info_list.remove(user_info)<br>
    print(user_info_list)</p>
    <pre><code class="hljs"></code></pre>
    
    </div>
  • 相关阅读:
    Linux中yum命令镜像源和出错解决方案
    Redis编译安装
    Linux下安装Redis
    zabbix3.4.2的安装及配置
    【前端】活动表单
    【笔记】archlinux缺少部分常用工具
    【笔记】BootstrapTable带参数刷新数据的坑
    【笔记】Win7连接公司内网无法打开网页
    【笔记】Archlinux下配置rsyslog写日志到mysql
    【笔记】Gave up waiting for suspend/resume device
  • 原文地址:https://www.cnblogs.com/abdm-989/p/11770595.html
Copyright © 2011-2022 走看看