首页 > 编程语言 >Python高级之闭包函数

Python高级之闭包函数

时间:2023-12-12 21:12:45浏览次数:46  
标签:闭包 outer 函数 power Python 之闭 外部 变量

闭包函数

【一】闭包函数的定义

闭包(Closure)是指在函数内部定义的函数,并且这个内部函数可以访问外部函数的变量。这种机制允许函数保留对它创建时可见的变量的访问权,即使在其生命周期结束后也可以使用。

闭包的主要特点是:

  1. 内部函数定义在外部函数内部。
  2. 内部函数可以引用外部函数的变量。
  3. 外部函数返回内部函数。

下面是一个简单的闭包的示例:

pythonCopy codedef outer_function(x):
    # 外部函数定义一个变量
    outer_variable = x

    def inner_function(y):
        # 内部函数引用外部函数的变量
        result = outer_variable + y
        return result

    # 外部函数返回内部函数
    return inner_function

# 创建闭包函数
closure = outer_function(10)

# 使用闭包函数
result = closure(5)
print(result)  # 输出结果:15

在这个例子中,outer_function 是外部函数,它接受一个参数 x 并定义了一个变量 outer_variable。然后,它内部定义了一个函数 inner_function,该函数引用了外部函数的变量 outer_variable。最后,外部函数返回了内部函数。

当调用 outer_function(10) 时,它返回了一个闭包函数 closure,这个闭包函数可以在调用时引用 outer_variable 的值。当调用 closure(5) 时,它实际上执行了内部函数,并使用了外部函数中定义的变量,输出结果为 15

闭包在某些情况下非常有用,例如在函数式编程中,它可以用来创建具有状态的函数。

【二】闭包函数的使用场景

闭包函数在许多情况下都可以派上用场,特别是在需要在函数之间共享变量的情况下。以下是一些使用闭包函数的常见场景:

  1. 封装:

    • 闭包可以用于封装代码块,将相关的逻辑组织在一起。通过闭包,可以在内部函数中访问外部函数的局部变量,同时将这些变量保护在局部作用域中。
  2. 工厂函数:

    • 闭包可以用于创建工厂函数,即函数返回另一个函数,而返回的函数可以使用外部函数的参数和局部变量。这样的结构可以用于生成具有特定行为或配置的函数。
    def power_factory(exponent):
        def power(x):
            return x ** exponent
        return power
    
    # 创建平方和立方函数
    square = power_factory(2)
    cube = power_factory(3)
    
    print(square(4))  # 输出结果:16
    print(cube(2))    # 输出结果:8
    
    # 在这个例子中,power_factory 是一个工厂函数,它返回一个计算幂的闭包函数。通过调用 power_factory(2),我们创建了一个平方函数,通过调用 power_factory(3),我们创建了一个立方函数
    
  3. 保持状态:

    • 闭包可以用于保持函数的状态。由于内部函数可以访问外部函数的变量,闭包使得函数在调用之间保持状态,而不需要使用全局变量。
    def counter():
        count = 0
        def increment():
            nonlocal count
            count += 1
            return count
        return increment
    
    # 创建计数器
    counter1 = counter()
    print(counter1())  # 输出结果:1
    print(counter1())  # 输出结果:2
    
    counter2 = counter()
    print(counter2())  # 输出结果:1 (独立的计数器)
    
    # 在这个例子中,counter 是一个计数器工厂函数,它返回一个闭包函数 increment,该函数可以在调用时增加计数器的值。通过创建两个不同的计数器,我们保持了两个独立的状态。
    
  4. 回调函数:

    • 闭包可以用于创建回调函数,即将函数作为参数传递给其他函数,同时传递一些状态信息。这在事件处理、异步编程等方面非常常见。
  5. 装饰器:

    • 闭包在装饰器的实现中被广泛使用。装饰器是一种用于修改或扩展函数行为的技术。通过使用闭包,可以方便地在不修改原函数代码的情况下添加新的功能。
  6. 迭代器和生成器:

    • 闭包在创建迭代器和生成器时也很有用。在内部函数中可以使用外部函数的变量来保持状态,并实现惰性计算。
  7. 事件处理:

    • 在事件驱动的程序中,闭包可以用于创建处理事件的回调函数,同时保留一些状态信息。
  8. 单例模式:

    • 闭包可以用于实现单例模式,确保某个类只有一个实例。通过闭包,在函数内部保存一个实例,并在需要时返回这个实例。

总的来说,闭包在需要保持状态、封装逻辑、实现回调等方面非常有用。在合适的场景下,使用闭包可以使代码更加清晰、模块化,并提供一种灵活的方式来处理变量和函数之间的关系。

标签:闭包,outer,函数,power,Python,之闭,外部,变量
From: https://www.cnblogs.com/Lea4ning/p/17897821.html

相关文章

  • Python项目之员工管理系统-函数版
    员工管理系统#完成以下功能'''---------------员工系统---------------1:注册2:登陆3:添加员工信息4:查看指定员工信息5:查看所有员工信息6:删除指定员工信息......
  • golang http post 执行函数效率最高,速度最快实现
    在Go语言中,使用标准库的net/http包可以进行HTTPPOST请求。为了获得最高的执行效率和最快的速度,可以使用http.Client结构体来管理和复用HTTP连接,并使用http.NewRequest创建请求对象,然后使用http.Client的Do方法发送请求。以下是一个示例代码,展示如何使用Go语言的net/http包执行高效......
  • 内置函数
    内置方法函数用法int.bit_length()返回整数的二进制表示中最高位的位数,不包括符号和前导零int.to_bytes(length,byteorder,signed)将整数转换为字节数组。int.add(other)实现整数的加法运算。int.sub(other)实现整数的减法运算。int.mul(other)实现......
  • 无涯教程-Java Access Modifiers函数
    Java提供了许多访问修饰符来设置类,变量,方法和构造函数的访问级别。四个访问级别是-default(默认):对当前包可见,不需要修饰符。private(私有):当前类可见。public(公共):都可见。protected(受保护):对当前包和所有子类可见。默认访问修饰符默认访问修饰符意味着我们......
  • 侯哥的Python分享--系列教程
    合集-mysql(26) 1.侯哥的Python分享2019-04-162.MySQL基础1-关系型数据库与非关系型数据库2022-03-173.MySQL基础2-数据库及表的操作2022-03-174.MySQL基础3-数据库增删改操作2022-03-175.MySQL基础4-数据查询07-176.MySQL基础5-用户及权限管理07-187.MySQL基础6-常用数......
  • Hive的NVL()函数
    Hive的NVL()函数是用于处理空值(NULL)的函数之一。它接受两个参数:要检查的表达式和默认值。如果表达式为NULL,则NVL()函数返回默认值;否则,它返回表达式的值。以下是NVL()函数的详细说明:函数签名:NVL(expr,default)参数:expr是要检查的表达式,default是在expr为NULL时返回的默认值......
  • 无涯教程-Java - Singleton Classes函数
    Singleton的目的是控制对象的创建,将对象的数量限制为一个。由于只有一个Singleton实例,因此Singleton的任何实例字段在每个类中只会出现一次,就像static字段一样。单例通常控制对资源的访问,例如数据库连接或Socket。例如,如果您仅对数据库的一个连接拥有许可证,或者JDBC驱动......
  • 笔记:Qt开发之定制化qDebug()函数
    目标:实现qDebug()函数的定制输出,包含文件名、函数名、行数等信息1,通过qSetMessagePattern函数,实现定制化输出intmain(intargc,char**argv){QApplicationapp(argc,argv);//改变缺省消息处理程序的输出,信息:线程:功能函数(行数):时间qSetMessagePattern("%{mes......
  • 无涯教程-MFC - List Control函数
    列表视图控件的功能,该控件显示项目的集合,每个项目由一个图标和一个标签组成,它由CListCtrl类表示,列表控件包括使用以下视图显示项目列表。IconsSmallIconsListReport让无涯教程通过创建一个新的基于MFC对话框的应用程序来研究一个简单的示例。步骤1-删除TODO行并拖动一......
  • Python办公自动化(一)对比execl内容
    Python办公自动化(一)对比execl内容安装依赖需要安装的库:openpyxl,pandas如何安装:打开命令行(win+R输入cmd/powershell),输入以下命令pipinstallopenpyxlpipinstallpandas代码新建一个文件夹,新建一个文件,文件名为compare.py,输入以下代码,保存。#使用说明#1.将df1.xlsx......