Python进阶知识:整理2 -> 闭包和装饰器

1 闭包

什么是闭包:
        定义双层嵌套函数,内层函数可以访问外层函数的变量,将内存函数作为外层函数地返回值,此内层函数就是闭包函数

 

1.1 简单闭包

可以让内部函数可以用外部函数的变量

# 1.简单闭包   ->  可以让内部函数可以用外部函数的变量
def outer(logo):
    def inner(msg):
        print(f"<{logo}>{msg}<{logo}>")

    return inner


f1 = outer('Hello')
f1("python")

1.2 nonlocal关键字

使用nonlocal关键字,在闭包函数中,可以修改外部函数的变量

# 2. 使用nonlocal关键字,在闭包函数中,可以修改外部函数的变量
def outer(num1):
    def inner(num2):
        nonlocal num1
        num1 = 100
        print(num1 + num2)

    return inner

f1 = outer(10)
f1(20)


1.3 使用闭包实现ATM案例

def account_create(initial_amount=0):
    def atm(num, deposit=True):
        nonlocal initial_amount
        if deposit:
            initial_amount += num
            print(f"账户余额为:{initial_amount}")
        else:
            initial_amount -= num
            print(f"账户余额为:{initial_amount}")

    return atm


atm = account_create(100)  # 调用一次,值可以保留下来
atm(20, False)

1.4 总结

优点:
        1.无需定义全局变量即可实现通过函数,持续访问、修改某个值
        2.闭包函数引用的外部变量,是外层函数的内部变量。作用域封闭难以被错误修改
        
缺点:内存不释放,占用内存

2 装饰器

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

# 1.装饰器的一般写法(闭包)
def sleep():
    import random
    import time
    print("睡觉中...")
    time.sleep(random.randint(1, 6))


def outer(func):
    def inner():
        print("早上好")
        func()
        print("晚上好")

    return inner


fn1 = outer(sleep)
fn1()




# 2. 装饰器的语法糖写法
def outer(func):
    def inner():
        print("早上好")
        func()
        print("晚上好")

    return inner

@outer
def sleep():
    import random
    import time
    print("睡觉中...")
    time.sleep(random.randint(1, 6))

sleep()

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是小蟹呀^

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值