深入理解Python闭包:提升编程效率与功能封装

文章目录

    • [1. 闭包的基本概念](#1. 闭包的基本概念)
    • [2. 闭包的应用实例](#2. 闭包的应用实例)
      • [2.1 使用闭包创建装饰器](#2.1 使用闭包创建装饰器)
      • [2.2 使用闭包实现数据封装](#2.2 使用闭包实现数据封装)
    • [3. 闭包的限制与注意事项](#3. 闭包的限制与注意事项)

python中的闭包是什么,昨天被面试官问到了,我还以为是左闭右开区间中的"闭"...

1. 闭包的基本概念

闭包(Closure):由函数及其相关的引用环境组合而成的一个整体(即:闭包=函数+引用环境),意味着该函数不仅可以访问到它自己内部的变量,还能访问到其外部函数的变量。

创建闭包需要满足的几个条件:

  • 必须有一个内嵌函数
  • 内嵌函数需要引用外部函数的变量
  • 外部函数的返回值必须是内嵌函数
python 复制代码
def outer_function(text):
    def inner_function():
        print(text)
    return inner_function

my_function = outer_function('Hello, World!')
my_function()

闭包解释:

  • outer_function 是外部函数,接收参数 text
  • inner_function 是内嵌在 outer_function 内部的函数,访问了外部函数的局部变量 text
  • outer_function 的返回值是 inner_function 这个函数自身,而不是函数的执行结果。
  • my_function 被赋值为 outer_function 返回的 inner_function 函数,当调用 my_function() 时,实际上是在执行 inner_function()

通过这个例子可以看到,即便是在外部函数执行完毕后,内部函数仍然可以访问到外部函数的局部变量 text。这种机制,就是闭包的工作原理。

2. 闭包的应用实例

闭包可以在多种场景中发挥作用。例如,可以用来创建装饰器、延迟执行的函数等。

2.1 使用闭包创建装饰器

装饰器本质上是一个接受函数作为参数并返回一个新函数的闭包。

python 复制代码
def my_decorator(func):
    def wrapped():
        print("函数准备执行")
        func()
        print("函数执行完毕")
    return wrapped

@my_decorator
def my_function():
    print("Hello, World!")

my_function()

代码解释:

  • my_decorator 是一个装饰器,它本质上是一个闭包,接受一个函数 func 并返回一个新的函数 wrapped
  • wrapped 函数在调用原有 func 函数前后,添加了打印操作。
  • 使用 @my_decorator 语法,将 my_decorator 应用到 my_function 上,每次调用 my_function 都会执行 wrapped 中的代码。

2.2 使用闭包实现数据封装

闭包也可以用来封装数据,在很多需要创建对象而又不想使用类的场景中非常有用。

python 复制代码
def make_multiplier(x):
    def multiplier(n):
        return x * n
    return multiplier

double = make_multiplier(2)
triple = make_multiplier(3)

print(double(5))  # 输出 10
print(triple(5))  # 输出 15
  • make_multiplier 函数创建并返回了一个 multiplier 函数,该函数能够记住外部函数的变量 x
  • doubletriple 函数分别固定了乘数为 2 和 3。这样就创建了两个功能不同的函数,但它们都源于同一个外部函数。

3. 闭包的限制与注意事项

  • 闭包可以导致某些变量不会被垃圾回收,从而增加内存的使用。
  • 确保不要在闭包内部修改外部变量的值,这可能会导致难以追踪的bug。

推荐我的相关专栏:

相关推荐
肖田变强不变秃21 分钟前
C++实现矩阵Matrix类 实现基本运算
开发语言·c++·matlab·矩阵·有限元·ansys
沈霁晨37 分钟前
Ruby语言的Web开发
开发语言·后端·golang
小兜全糖(xdqt)39 分钟前
python中单例模式
开发语言·python·单例模式
DanceDonkey40 分钟前
@RabbitListener处理重试机制完成后的异常捕获
开发语言·后端·ruby
Python数据分析与机器学习1 小时前
python高级加密算法AES对信息进行加密和解密
开发语言·python
noravinsc1 小时前
python md5加密
前端·javascript·python
军训猫猫头1 小时前
52.this.DataContext = new UserViewModel(); C#例子 WPF例子
开发语言·c#·wpf
唯余木叶下弦声1 小时前
PySpark之金融数据分析(Spark RDD、SQL练习题)
大数据·python·sql·数据分析·spark·pyspark
ac-er88881 小时前
Yii框架优化Web应用程序性能
开发语言·前端·php
程序媛徐师姐2 小时前
Python基于Django的社区爱心养老管理系统设计与实现【附源码】
python·django·社区爱心养老·社区爱心养老管理系统·python社区养老管理系统·社区养老·社区养老管理系统