闭包和装饰器

python 复制代码
#闭包的作用
#全局变量有被修改的风险,代码在命名空间上不够干净整洁
#第一种,不使用闭包的场景
account_amount=0
def atm(num,deposit=True):
    global account_amount
    if deposit:
        account_amount+=num
        print(f"存款:+{num},账户余额{account_amount}")
    else:
        account_amount-=num
        print(f"存款:-{num},账户余额{account_amount}")
atm(300) #存款:300,账户余额300
atm(300) #存款:300,账户余额600
atm(100,False) #存款:100,账户余额500
#从上面可以看到全局变量在被不断的修改,同时,代码也不够干净

#使用闭包的写法见如下,这种就不会有全局变量了,这种就是闭包了
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
fn=account_create()
fn(100)  #存款+100,账户余额100
fn(200)  #存款+200,账户余额300

#闭包的优点 无需要定义全局变量就可以通过函数,持续的访问修改某个值,闭包使用的变量在于函数内,难被错误的调用修改
#缺点,由于内部持续引用外包函数的值,所以会导致内存空间不足,一直占用内存
相关推荐
Flittly3 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(3)TodoWrite (待办写入)
python·agent
千寻girling7 小时前
一份不可多得的 《 Django 》 零基础入门教程
后端·python·面试
databook11 小时前
探索视觉的边界:用 Manim 重现有趣的知觉错觉
python·动效
明月_清风12 小时前
Python 性能微观世界:列表推导式 vs for 循环
后端·python
明月_清风12 小时前
Python 性能翻身仗:从 O(n) 到 O(1) 的工程实践
后端·python
helloweilei1 天前
python 抽象基类
python
用户8356290780511 天前
Python 实现 PPT 转 HTML
后端·python
zone77391 天前
004:RAG 入门-LangChain读取PDF
后端·python·面试
zone77391 天前
005:RAG 入门-LangChain读取表格数据
后端·python·agent
树獭非懒2 天前
AI大模型小白手册|Embedding 与向量数据库
后端·python·llm