python高级用法_闭包

闭包

在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包

简单闭包
def outer(logo):
    def inner(msg):
        print("<%s>%s<%s>" % (logo, msg, logo))

    return inner


fn1 = outer("中国")
fn1("江苏省")
fn1("南京市")

fn2 = outer("美国")
fn2("华盛顿")
fn2("洛杉矶")

在这里插入图片描述

首先向外部函数传参,并返回内部函数

fn1 = outer(“中国”)

再向内部函数传参

fn1(“江苏省”)

内部函数修改外部函数的变量

如果想要在内部函数中修改外部函数的变量,使用nonlocal

def outer(num1):
    def inner(num2):
        nonlocal num1
        num1 += num2
        print("内部的num1:"+str(num1))
    return inner


f = outer(10)
f(10)
f(10)

在这里插入图片描述

使用闭包实现ATM小案例
def create_account(balance=0):
    def atm(num, save=True):
        nonlocal balance
        if save:
            balance += num
            print(f"存款:+{num},余额:{balance}")
        else:
            balance -= num
            print(f"取款:+{num},余额:{balance}")

    return atm


account = create_account()  # 创建账户
account(100)  # 存款100
account(200)  # 存款200
account(150, save=False)  # 取款150

在这里插入图片描述

闭包的优缺点

优点

  • 无需定义全局变量即可实现通过函数,持续的访问、修改某个值
  • 闭包使用的变量的所用于在函数内,难以被错误的调用修改

缺点

由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放掉,一直占用内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值