首页 > 编程语言 >【Python】高阶函数

【Python】高阶函数

时间:2024-06-16 19:28:11浏览次数:18  
标签:function 函数 Python value num len 高阶 def

高阶函数

高阶函数是接受另一个函数作为参数,并返回一个函数作为结果的函数。

这种类型的函数是函数式编程的核心,因为它们允许对行为进行抽象和复用,使得代码更加简洁和灵活。

def apply_function(func, value):
    return func(value)

def square(x):
    return x * x

print(apply_function(square, 5))  # 输出 25
  • 使用高阶函数实现简易四则运算计算器

    class calculator:
        def apply(self, func, *value):
            return func(*value)
        
        def add(self, *value):
            num = 0
            value_len = len(value)
            for i in range(value_len):
                num = num + value[i]
            
            return num
        
        def sub(self, *value):
            value_len = len(value)
            num = value[0] if (value_len > 0) else 0
            
            for i in range(1, value_len):
                num = num - value[i]
            
            return num
        
        def product(self, *value):
            value_len = len(value)
            num = 1 if (value_len > 0) else 0
            
            for i in range(value_len):
                num = num * value[i]
            
            return num
        
        def division(self, *value):
            value_len = len(value)
            num = value[0] if (value_len > 0) else 0
            
            for i in range(1, value_len):
                num = num / value[i]
            
            return num
    
    cal = calculator()
    
    num_add = cal.apply(cal.add, 1,2,3,4,5)
    num_sub = cal.apply(cal.sub, 10,1,1,1,1)
    num_pro = cal.apply(cal.product, 10,1,1,1,1)
    num_div = cal.apply(cal.division, 10,1,1,1,1)
    

常用的高阶函数工具:

  1. lambda

    • 功能:创建匿名函数,并返回一个函数对象。

    • 语法lambda arguments: expression

    • 参数

      • arguments:函数的参数,可以是任意数量的参数。
      • expression:函数体,只能是一个表达式,该表达式的结果就是这个匿名函数的返回值。
    • 返回值:返回一个函数对象。

    • 示例

      # 定义一个简单的 lambda 表达式作为函数
      add = lambda x, y: x + y
      # 使用定义的 lambda 函数计算两数之和并打印
      print(add(3, 5))  # 输出: 8
      
  2. filter()

    • 功能:应用函数过滤序列,过滤掉不符合条件的元素。

    • 语法filter(function, iterable)

    • 参数

      • function:用来测试元素是否符合条件的函数。
      • iterable:包含需要过滤的元素的可迭代对象。
    • 返回值:返回一个迭代器,迭代器中的元素是符合条件的元素。

    • 示例

      nums = [1, 2, 3, 4, 5, 6]
      even_nums = filter(lambda x: x % 2 == 0, nums)
      print(list(even_nums))  # 输出 [2, 4, 6]
      
  3. map():

    • 功能:用于对序列中的每个元素应用一个给定的函数,并返回一个包含结果的迭代器。

    • 语法map(function, iterable, ...)

    • 参数

      • function:接受一个输入并返回一个值的函数。
      • iterable:一个或多个序列。如果提供了多个序列,则函数应该接受相同数量的参数,每个序列中的元素按顺序配对。
    • 返回值:返回一个迭代器,其元素是将输入的序列中的元素传递到函数后得到的结果。

    • 示例

      nums = [1, 2, 3, 4, 5]
      squared_nums = map(lambda x: x ** 2, nums)
      print(list(squared_nums))  # 输出 [1, 4, 9, 16, 25]
      
  4. reduce():

    • 功能:用于将一个接受两个参数的函数依次地应用到序列的元素上,从而将序列减少为单一的值。

    • 语法reduce(function, iterable[, initializer])

    • 参数

      • function:接受两个参数并返回单个值的函数。
      • iterable:可迭代序列,其元素将被从左到右依次处理。
      • initializer:(可选) 初始值,如果提供,它被放在参与处理的序列的最前面,并在空序列上作为默认值。
    • 返回值:返回单一的值,是通过将函数应用于序列的元素累积得到的。

    • 示例

      from functools import reduce
      
      nums = [1, 2, 3, 4, 5]
      result = reduce(lambda x, y: x + y, nums)
      print(result)  # 输出 15
      
      result = reduce(lambda x, y: x + y, nums, 2)
      print(result)  # 输出 17
      

递归函数

函数可以返回自身来解决问题(函数本身调用自己),这称为递归函数。

# 计算斐波那契数
def factorial(x):
    if x == 1:
        return 1
    else:
        return x * factorial(x - 1)

if __name__ == '__main__':
    x = factorial(10)
    print(f"The factorial number is {x}")
    
    # The factorial number is 3628800

装饰器

装饰器是一种设计模式,用于修改一个函数、方法或类的行为,而无需直接修改其本身的代码。装饰器在Python中通过高阶函数实现,它接收一个函数作为参数并返回一个新的函数。

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

# 方法一:不使用语法糖 @
def say_hello():
    print("Hello!")
    
hello = my_decorator(say_hello)
hello()

# 方法二:使用语法糖 @
@my_decorator
def say_hello():
    print("Hello!")

say_hello()

闭包

闭包是一个记录了某些函数变量的包裹体,使这些变量即使在函数执行完成后也仍然可访问。闭包常用于封装私有数据。

def outer_function(msg):
    message = msg

    def inner_function():
        print(message)

    return inner_function

my_func = outer_function('Hello')
my_func()

类型提示

从Python 3.5开始,可以在函数中添加类型提示,提高代码的可读性和可维护性。

# 参数:字符串类型   返回值:字符串类型
def greet(name: str) -> str:
    return f"Hello {name}"

print(greet("Alice")) # Hello Alice

标签:function,函数,Python,value,num,len,高阶,def
From: https://blog.csdn.net/hdz_wiz_csdn/article/details/139580009

相关文章

  • python做的游戏有哪些
    比较大型的,使用Python的游戏有两个,一个是《EVE》,还有一个是《文明》。另外GitHub上有很多开源的小游戏,下面给大家介绍一下:1.Github上面有个项目FreePythonGames,里面集合了不少的Python开发的小游戏,能玩,也适合新手用来练练手,另外PyGame这个网站里面里面集合了很多Python......
  • 裸函数和调用约定
    一、裸函数在正常的函数编译中,即使函数没有定义函数体的内容,编译器也依然会编译出部分汇编指令用来执行函数。但是如果定义一个裸函数void_declspec(naked)test()编译器将不会操作这个函数,不会给其生成汇编指令(但是会在主函数中生成call和jmp指令指向这个裸函数)可以看到......
  • Python爬虫下载漫画
    《谒金门·萧瑟霜》情眷恋古往今来相看几度流光人更远伤离方寸乱回梦空传幽怨依旧尘缘未断碧落黄泉寻觅遍愁来天不管最近有个轻小说改编动漫《在异世界迷宫开后宫》开播,看着还行,小说一般,流水账的感觉,而且目前国内暂时没有文库版的翻译,只有web版的个人翻译,不过对应......
  • 学会python——读取大文本文件(python实例六)
    目录1、认识Python2、环境与工具2.1python环境2.2VisualStudioCode编译3、读取大文本文件3.1代码构思3.2代码示例3.3运行结果4、总结1、认识PythonPython是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有很强的可读......
  • DDMP中的损失函数
    接着扩散模型简述训练扩散模型过程中用到的损失函数形式。完整的观察数据\(x\)的对数似然如下:\[\begin{aligned}\mathrm{log}\p(x)&\geq\mathbb{E}_{q_{\phi}(z_{1:T}|z_0)}\mathrm{log}\frac{p(z_T)\prod_{t=0}^{T-1}p_{\theta}(z_t|z_{t+1})}{\prod_{t=0}^{T-1}q_{\phi}......
  • Python爬虫获取B站漫画
    《眼儿媚·朦胧雾》身世飘零叹孤独回顾盼相扶情天不老雷霆易逝雨过云舒相思不忍轻离别携手更如初风急波涌扁舟不系终恋江湖最近有妖气上《鬼刀》停止更新了,Bilibili漫画上的又不能下载保存到本地,加上最近正在玩StyleGANs,需要一些动漫图片做训练数据集,所以搞个爬......
  • python IP 端口 socket tcp 介绍
    IP端口介绍1、IPIP地址是分配给网络设备上网使用的数字标签,它能够标识网络中唯一的一台设备windows环境可以使用ipconfig来查看自己的iplinux环境可以使用ifconfig来查看自己的ip2、端口端口是传输数据的通道,每个操作系统上都有65535个端口,通过对应的端口号把数......
  • 类对象属性(python练习)
    编写一个程序来创建一个类并使用该类的方法来打印属性。创建一个类:创建自行车Bicycle类。在类中,创建两个方法:__init__()和print_attributes()。类有两个属性:gear'和speed,它们应该在init()`中初始化。在print_attributes()方法中,将gear属性和speed属性分别打印在两行。在类......
  • 【华为OD】D卷真题200分:数字游戏 python代码实现[思路+代码]
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客JS、Java、C、python、C++代码实现:【华为OD】D卷真题200分:数字游戏JavaScript代码实现[思路+代码]-CSDN......
  • 16个免费学习Python的网站和教程(2024年最新资源)
    16个免费学习Python的网站和教程(2024年最新资源)博主猫头虎的技术世界......