zoukankan      html  css  js  c++  java
  • Python中匿名函数与内置高阶函数详解

    大家好,从今天起早起Python将持续更新由小甜同学从 初学者的角度 学习Python的笔记,其特点就是全文大多由 新手易理解 的 代码与注释及动态演示 。刚入门的读者千万不要错过!

    很多人学习python,不知道从何学起。
    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
    很多已经做案例的人,却不知道如何去学习更加高深的知识。
    那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
    QQ群:1097524789

    为了配合 Python办公自动化 系列文章,本文带来的是 偷学Python第二十四天: Python中匿名函数与内置高阶函数使用,其他内容将在近期更新完毕,本文目录如下

    匿名函数

    如果我们需要定义一个特别简单的函数,例如

    def add(a, b):
    s = a + b
    return s

    这就出现问题了,这么优雅的Python怎么可以出现这种难看的代码呢,有没有办法可以将其简化为1行代码呢?这么优雅的Python肯定有办法将其简化的方法啊!这要用到匿名函数了。P ython中使用   lambda 关键字来创建匿名函数。

    lambda [参数1 [,参数2,..参数n]]:表达式

    示例代码

    """
    -*- coding:uft-8 -*-
    author: 小甜
    time:2020/5/23
    """
    news_add = lambda a, b: a + b
    # 上面的那个等于
    def news_add_old(a, b):
    return a + b

    x = news_add_old(5, 10)
    y = news_add(5, 10) # 调用匿名函数
    print(x, y) # 15 15

    结合内置函数使用

    """
    -*- coding:uft-8 -*-
    author: 小甜
    time:2020/5/23
    """

    list1 = [{"a": 10, "b": 20}, {"a": 20, "b": 20}, {"a": 50, "b": 20}, {"a": 6, "b": 20}, {"a": 9, "b": 20}]

    # 那个列表中的a最大
    max_value = max(list1, key=lambda x: x["a"])
    print(max_value)

    # 如果用普通的函数写就多了几行
    def func(di):
    return di["a"]
    max_value = max(list1, key=func) # 这里不能加()不然就表示调用了
    print(max_value)

    也可以将匿名函数当做参数

    def func(a, b, fun):
    s = fun(a, b)
    return s

    z = func(5, 10, lambda a, b: a + b)
    print(z) # 15

    注:lambda可以省去定义函数的过程,让代码更加精简,而且不用考虑命名问题,但是在PEP8规范里面是不推荐用lambda这种方式的

    内置函数

    map( )

    map() 会根据提供的函数对指定序列做映射,使用方法:

    map(function, iterable, ...)

    第一个参数 function 以参数序列中的每一个元素调用 function 函数, 第二个参 数 iterable 一个或多个序列。其 返回包含每次 function 函数返回值的新列表。

    示例代码

    """
    -*- coding:uft-8 -*-
    author: 小甜
    time:2020/5/23
    """
    list1 = [1, 2, 4, 5, 56, 12, 5, 2, 34]

    # 生成一个函数
    def func(lt): # 将偶数返回,奇数+1返回
    if lt % 2 == 0:
    return lt
    else:
    return lt + 1


    list2 = map(func, list1) # 千万不能加()
    # 使用lambda关键字
    list3 = map(lambda i: i if i % 2 == 0 else i + 1, list1)
    print(list(list3)) # [2, 2, 4, 6, 56, 12, 6, 2, 34]
    print(list(list2)) # [2, 2, 4, 6, 56, 12, 6, 2, 34]

    reduce( )

    reduce() 函数在Python2.x的时候是系统内置的函数,到Python3.x就已经归入functools库里面了。

    reduce() 函数会对参数序列中元素进行累 积。 函数将一个数据集合(链表,元组等)中的所有数据进行下列操作: 用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

    reduce(function, iterable[, initializer])

    示例代码

    """
    -*- coding:uft-8 -*-
    author: 小甜
    time:2020/5/23
    """
    from functools import reduce

    list1 = [1, 2, 3, 4, 5, 6, 7]
    value = reduce(lambda x, y: x + y, list1)
    print(value) # 28 = 1+2+3+4+5+6+7

    执行流程即 将计算结果存储到x,每次累计。initializer就是设置x的初始值,演示如下

    filter( )

    filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。

    该方法接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

    filter(function, iterable)

    sorted( )

    sorted()   函数对所有可迭代的对象进行排序操作,返回的是一个新的 list.返回重新排序的列表。

    sorted(iterable, cmp=None, key=None, reverse=False)
    • iterable – 可迭代对象。

    • cmp – 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。

    • key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

    • reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

    示例代码

    """
    -*- coding:uft-8 -*-
    author: 小甜
    time:2020/5/23
    """
    students = [
    {'name': 'tom', 'age': 20},
    {'name': 'lucy', 'age': 15},
    {'name': 'lily', 'age': 13},
    {'name': 'mark', 'age': 21},
    {'name': 'jack', 'age': 13},
    {'name': 'steven', 'age': 18},
    ]

    # 找出所有年龄大于18岁学生
    result = filter(lambda x: x['age'] > 18, students)
    print(list(result)) # [{'name': 'tom', 'age': 20}, {'name': 'mark', 'age': 21}]

    # 按照年龄从小到大排序
    students = sorted(students, key=lambda x: x['age'], reverse=True) # 利用key

    print(students)
    '''
    [{'name': 'mark', 'age': 21}, {'name': 'tom', 'age': 20},
    {'name': 'steven', 'age': 18}, {'name': 'lucy', 'age': 15},
    {'name': 'lily', 'age': 13}, {'name': 'jack', 'age': 13}]
    '''
  • 相关阅读:
    多语言资源文件制作工具
    window service 插件服务插件开发
    .net 中读取自定义Config文件
    Asp.net 主题中CSS文件的缓存问题
    Asp .net 4.0 中ViewStatus 使用
    Linq通用分页数据查询方法
    EF中查询出现死锁的处理
    Windows Live Writer 分享到插件
    Windows Resx资源文件编辑工具
    插件式服务架构
  • 原文地址:https://www.cnblogs.com/shann001/p/13042912.html
Copyright © 2011-2022 走看看