• Python武器库开发-高级特性篇(八)


    高级特性篇(八)

    高阶函数

    Python作为一门高级编程语言,拥有着强大的函数式编程能力。其中高阶函数就是Python函数式编程的重要组成部分。在Python中,函数可以被当作变量一样进行操作,包括作为参数传递给其他函数,或者作为返回值从函数中返回。这种能够处理函数的函数就被称为高阶函数。简而言之,高阶函数就是能够接受函数作为参数或者返回函数的函数。

    在Python中,函数被称为一等公民(first-class citizens),这意味着函数可以像其他数据类型一样进行操作,例如可以赋值给变量、作为参数传递、作为返回值返回等。这种特性使得Python中的函数可以非常灵活地被用于各种不同的场景。高阶函数是指接收函数作为参数或者返回值是一个函数的函数,是Python函数式编程的重要手段之一。

    在函数式编程中,函数是一等公民,可以作为变量、参数、返回值等使用。下面我们将分别介绍Python高阶函数中的四个经典应用:filter、reduce、sorted、map,并结合实际案例进行详细讲解:

    filter函数是Python中常用的高级函数之一,其作用是从一个序列中过滤出符合条件的元素,将结果以一个filter类型返回。

    下面我们来看一下filter函数的案例:

    # 过滤列表中的偶数
    def is_even(n):
        return n % 2 == 0
    
    num_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    new_list = list(filter(is_even, num_list))
    print(new_list)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这个例子中,我们定义了一个is_even函数用于判断一个数是否为偶数。然后我们用filter函数对num_list中的元素依次进行判断,将所有偶数提取出来,最终得到一个新的列表new_list:

    在这里插入图片描述

    reduce函数是Python中另一个常用的高级函数,其作用是对一个序列进行归约操作,将其简化为一个数。reduce函数会将归约函数function递归作用于序列sequence的每个元素,将结果与下一个元素一起作为function的输入,最终仅得到一个结果值。如果指定了initial,则将该值与序列的第一个元素一起进行归约操作。

    下面我们来看一个reduce函数的实例:

    # 计算列表中数字的和
    
    from functools import reduce
    
    def add(x,y):
        return x + y
    
    num_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    result = reduce(add, num_list)
    print(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    这个例子中,我们定义了一个add函数用于求和。然后我们用reduce函数对num_list中的元素依次进行求和,得到最终的结果。其中,reduce函数会将add函数用于num_list中的前两个元素,然后将结果与第三个元素合并,一直递归下去,直到得到最终的结果:

    在这里插入图片描述

    sorted函数是Python中常用的高级函数之一,其作用是对一个集合进行排序,返回一个新的排序后的集合。sorted函数会返回一个新的集合,该集合是iterable排序后的结果。下面我们来看一个Sorted函数的实例:

    # 对列表中的数字进行排序
    
    num_list = [5, 2, 3, 1, 4]
    result = sorted(num_list)
    print(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这个例子中,我们使用sorted函数对num_list进行排序。sorted函数会将num_list排序后生成一个新的列表,并将其赋值给result变量:

    在这里插入图片描述

    map函数是Python中常用的高级函数之一,其作用是对一个序列中的每个元素进行函数操作,返回一个新的序列。map函数会对序列中的每个元素依次调用function函数,返回一个新的序列。下面我们来看一个map函数的实例:

    # 对列表中的数字求平方
    
    def square(n):
        return n ** 2
    
    num_list = [1, 2, 3, 4, 5]
    new_list = list(map(square, num_list))
    print(new_list)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这个例子中,我们定义了一个square函数用于对数字求平方。然后我们用map函数对num_list中的元素依次进行求平方,并组成一个新的列表new_list:

    在这里插入图片描述

    匿名函数

    在Python中,匿名函数是没有定义名称的函数。虽然def在Python中使用关键字定义了普通函数,但使用关键字定义了匿名函数lambda。因此,匿名函数也称为lambda函数。

    python中的lambda函数具有以下语法:

    lambda arguments: expression
    
    • 1

    Lambda函数可以具有任意数量的参数,但只能有一个表达式。表达式被求值并返回。Lambda函数可在需要函数对象的任何地方使用。

    这是一个使输入值翻倍的lambda函数示例:

    # 程序展示lambda函数的使用
    double = lambda x: x * 2
    
    print(double(5))
    
    • 1
    • 2
    • 3
    • 4

    以上实例输出的结果:

    在这里插入图片描述

    在上面的程序中,lambda x: x * 2是lambda函数。这里x是参数,x * 2是求值和返回的表达式。

    这个函数没有名字。它返回一个函数对象,该对象被分配给标识符double。我们现在可以把它叫做普通函数。下面声明

    double = lambda x: x * 2
    
    • 1

    就等同于

    def double(x):
       return x * 2
    
    • 1
    • 2

    当我们临时需要匿名函数时,我们使用lambda函数。在Python中,我们通常将其用作高阶函数的参数(该函数将其他函数作为arguments)。Lambda函数可以与filter(),map()等内置函数一起使用。在Python函数中filter()接受一个函数和一个列表作为参数。使用列表中的所有项调用该函数,并返回一个新列表,其中包含函数计算结果为True的项。这是使用filter()函数从列表中仅滤除偶数的示例。

    lambda与filter()一起使用的示例:

    # 程序从列表中过滤出偶数项
    my_list = [1, 5, 4, 6, 8, 11, 3, 12]
    
    new_list = list(filter(lambda x: (x%2 == 0) , my_list))
    
    print(new_list)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    以上代码的输出:

    在这里插入图片描述

    在Python中的map()函数接受一个函数和一个列表。

    使用列表中的所有项调用该函数,并返回一个新列表,其中包含该函数为每个项返回的项。

    这是使用map()函数将列表中所有项目翻倍的示例:

    # 使用map()将列表中的每个项加倍
    
    my_list = [1, 5, 4, 6, 8, 11, 3, 12]
    
    new_list = list(map(lambda x: x * 2 , my_list))
    
    print(new_list)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    以上代码的输出:

    在这里插入图片描述

    偏函数

    偏函数(Partial function)是Python的functools模块提供的一个很有用的功能。简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

    举个例子,int()函数可以把字符串转换为整数,当仅传入字符串时,int()函数默认按十进制转换:

    print(int('12345'))
    
    • 1

    以上代码输出的实例:

    在这里插入图片描述

    但int()函数还提供额外的base参数,默认值为10。如果传入base参数,就可以做N进制的转换:

    print(int('12345', base=8))
    print(int('12345', 16))
    
    • 1
    • 2

    以上代码输出的实例:

    在这里插入图片描述

    假设要转换大量的二进制字符串,每次都传入int(x, base=2)非常麻烦,于是,我们想到,可以定义一个int2()的函数,默认把base=2传进去:

    def int2(x, base=2):
        return int(x, base)
    
    print(int2('1000000'))
    print(int2('1010101'))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这样,我们转换二进制就非常方便了:

    在这里插入图片描述

    functools.partial可以帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2:

    import functools
    int2 = functools.partial(int, base=2)
    print(int2('1000000'))
    print(int2('1010101'))
    
    • 1
    • 2
    • 3
    • 4

    以上代码输出的实例:

    在这里插入图片描述

  • 相关阅读:
    一文带你了解如何使用spring拦截器获取请求体和响应体的内容
    能源势动:电力行业的碳中和该如何实现?
    45、tomcat+课后实验
    京东商品详情API:电商创新的利器
    93.STL-系统内置仿函数
    Java中Xml4j的使用
    NodeJS 防止xss攻击
    系统设计的端到端原则
    为什么现在的企业都在积极的验厂?
    Git基础教程详解
  • 原文地址:https://blog.csdn.net/qq_64973687/article/details/134079728