博客
关于我
python基础篇(15):闭包
阅读量:797 次
发布时间:2023-03-07

本文共 1625 字,大约阅读时间需要 5 分钟。

闭包(Closure)详解:简单应用与优缺点分析

闭包是函数嵌套编程中的一个重要概念,它允许内部函数(闭包)访问并使用外部函数的变量,并在适当条件下修改这些变量。这种机制在编写高效且具有灵活性的函数时非常有用。在本文中,我们将深入探讨闭包的基本概念、实际应用案例以及其优缺点。

1. 简单闭包示例

闭包的最基本应用可以通过以下代码实现:

def outer(logo):
def inner(msg):
print(f"<{logo}>{msg}
")
return inner

当我们定义并调用外部函数 outer 时,可以得到一个闭包函数 inner。通过赋值 fn = outer("博主帅绝天下"),我们将 inner 函数封装到 fn 中。随后,调用 fn("大家好") 将输出:

<博主帅绝天下>
大家好
<博主帅绝天下>

同样,通过 fn2 = outer("博主颜值镇九州") 可以实现类似的功能。这种闭包的应用在日常编程中非常常见,尤其是在需要灵活访问和修改外部变量时。

2. 修改外部函数变量的闭包

当我们需要在闭包中修改外部函数的变量时,必须使用 nonlocal 关键字。以下示例展示了如何在闭包中动态修改外部变量:

def outer(num1):
def inner(num2):
nonlocal num1
num1 += num2
print(num1)
return inner
fn = outer(10)
fn(10)

在上述代码中,nonlocal 关键字允许 inner 函数修改 num1。每次调用 fn 时,num1 会增加相应的数值。例如:

fn(10) → 打印 20
fn(10) → 打印 30
fn(10) → 打印 40

3. 实现 atm 取钱的闭包

闭包的实际应用场景之一是实现 atm 取钱功能。以下是基于闭包的 atm 取钱逻辑:

def account_create(initial_amount=0):
def atm(num, deposit=True):
nonlocal initial_amount
if deposit:
initial_amount += num
print(f"存款:+{num}, 账户余额:{initial_amount}")
else:
initial_amount -= num
print(f"取款:-{num}, 账户余额:{initial_amount}")
return atm
atm = account_create()
atm(100) # 存款:+100, 账户余额:100
atm(200) # 存款:+200, 账户余额:300
atm(100, deposit=False) # 取款:-100, 账户余额:200

4. 闭包的优缺点分析

闭包虽然功能强大,但也存在一些优缺点:

优点:
  • 无需定义全局变量:闭包允许我们在不定义全局变量的情况下,通过函数持续访问和修改特定值。
  • 变量封装:闭包使用的外部变量通常只在函数内部可见,避免了误操作的风险。
  • 缺点:
  • 内存占用:由于闭包在定义时会引用外部函数的变量,可能导致内存泄漏或占用。
  • 可见性问题:外部函数的变量可能被多个闭包引用,导致难以管理和追踪。
  • 结论

    闭包是函数嵌套编程中的一个强大工具,广泛应用于需要灵活变量访问和修改的场景。通过合理使用 nonlocal 关键字,我们可以在闭包中对外部变量进行修改。然而,在使用闭包时,需注意其对内存的占用问题,并谨慎管理变量的可见性和引用关系。

    转载地址:http://xaofk.baihongyu.com/

    你可能感兴趣的文章
    python | pyparsing,一个强大的 Python 库!
    查看>>
    python | pyqtgraph,一个神奇的 Python 库!
    查看>>
    python读取文本文件数据
    查看>>
    python | Python mock对象与测试替身
    查看>>
    python | Python pandas实现数据追加和合并的最佳方法
    查看>>
    python | Python 中检查一个数字是否是三态数
    查看>>
    python | Python 蒙特卡洛模拟
    查看>>
    python | Python中的类多态:方法重写和动态绑定
    查看>>
    python | Python模块缓存:sys.modules机制
    查看>>
    python | pyupgrade,一个有趣的 Python 库!
    查看>>
    Python | qutip,一个高级的 Python 库!
    查看>>
    python | reflex,一个无敌的 Python 库!
    查看>>
    python | reloading,一个强大的 Python 库!
    查看>>
    python | rich,一个无敌的 Python 库!
    查看>>
    python | rlax,一个超强的 强化学习领域 Python 库!
    查看>>
    python | rpyc,一个超实用的 Python 库!
    查看>>
    python | rq,一个无敌的 关于Redis 的Python 库!
    查看>>
    python读取字符串指定位置字符_python要怎么截取指定位置的字符串呢?
    查看>>
    python | scikit-llm,一个神奇的 Python 库!
    查看>>
    python | sentry,一个超酷的 关于错误监控工具 Python 库!
    查看>>