闭包和装饰器

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

#闭包的优点 无需要定义全局变量就可以通过函数,持续的访问修改某个值,闭包使用的变量在于函数内,难被错误的调用修改
#缺点,由于内部持续引用外包函数的值,所以会导致内存空间不足,一直占用内存
相关推荐
IT毕设梦工厂1 分钟前
计算机毕业设计选题推荐:基于大数据的城市空气污染物浓度数据分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·python·信息可视化·数据挖掘·数据分析·课程设计·数据可视化
程序员阿黄13 分钟前
基于 Django 与 Vue 3 的智能实验室预约系统设计与实现
后端·python·mysql·django·vue·毕设
金金计较.17 分钟前
Go语言-4
开发语言·golang
程序猿在线码字28 分钟前
深度学习(一)
python·深度学习·神经网络·机器学习
打工仔折腾 AI29 分钟前
用 Shell 脚本自动部署 mysqld_exporter 并接入 Prometheus 远程抓取
人工智能·后端·python·性能优化·ai agent 实战
梦想不只是梦与想37 分钟前
环境管理:Conda 与 venv
python·conda·uv
Yolanda_202238 分钟前
6.pytorch加载数据初认识
python
泡海椒39 分钟前
jquick-pdf 表格行列尺寸控制实战:单元格合并的可行边界
java·开发语言·pdf
更深兼春远40 分钟前
Python到底怎么用于测试?
自动化测试·软件测试·python·接口测试
我不会起名字3221 小时前
一天一道力扣Hot100(36):深度优先算法---组合总和
数据结构·c++·后端·python·算法·go