学习python仅收藏此一篇就够了(闭包,装饰器)

本文详细介绍了闭包的概念,展示了如何创建和使用简单闭包,涉及nonlocal关键字的应用以及闭包在内存管理中的影响。同时,通过装饰器的例子,说明了闭包在扩展函数功能上的作用。
摘要由CSDN通过智能技术生成

闭包

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

简单闭包

内部函数使用外部变量

def outer(name):
    def inner(name1):
        print(f"<{name}><{name1}><{name}>")

    return inner


f1 = outer("wyx")
f1("sxx")

f2 = outer("sx")
f2("wyx")
<wyx><sxx><wyx>
<sx><wyx><sx>

nonlocal关键字

如果需要修改外部函数变量的值,需要使用nonlocal关键字修饰外部函数的变量才可以在内部函数中修改它。

def outer(num1):

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

fn = outer(10)
fn(10) #20
fn(10) #30
account = 0
def atm(num, deposit=True):
    global account
    if deposit:
        account += num
        print(f"存款+{num},余额{account}")
    else:
        account -= num
        print(f"取款-{num},余额{account}")

atm(300)
atm(100, False)
存款+300,余额300
取款-100,余额200

#使用闭包实现
def account(amount=0):

    def atm(num, deposit=True):
        nonlocal amount
        if deposit:
            amount += num
            print(f"存款+{num},余额{amount}")
        else:
            amount -= num
            print(f"取款-{num},余额{amount}")

    return atm
    
atm = account()
atm(100)
atm(200)
存款+100,余额100
存款+200,余额300

注意事项:

优点,使用闭包可以让我们得到:

  • 无需定义全局变量即可实现通过函数,持续的访问,修改某个值

  • 闭包使用的变量的所用于在函数内,难以被错误的调用修改

缺点:

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

装饰器

装饰器其实也是一种闭包,其功能就是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能。

def outer(func):

    def inner():
        print("我要睡觉了")
        func()
        print("我要起床了")

    return inner

def sleep():
    import random
    import time
    print("睡眠中。。")
    time.sleep(random.randint(1,4))

fn = outer(sleep)
fn()
我要睡觉了
睡眠中。。
我要起床了

装饰器的语法糖写法

使用@outer定义在目标函数sleep之上

def outer(func):

    def inner():
        print("我要睡觉了")
        func()
        print("我要起床了")

    return inner

@outer

def sleep():
    import random
    import time
    print("睡眠中。。")
    time.sleep(random.randint(1,4))

sleep()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元气满满的热码式

感谢您的支持!我会继续努力发布

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值