[Python] 学习笔记-闭包

文章介绍了闭包的概念,它是如何通过函数嵌套来保护并访问外部变量的。闭包可以避免全局变量的篡改,但可能导致内存占用。接着讨论了装饰器,它是一种特殊的闭包,用于在不修改原函数代码的情况下添加新功能。文中通过实例展示了如何创建和使用装饰器。
摘要由CSDN通过智能技术生成

闭包-装饰器



一、闭包

全局变量有被篡改的风险,闭包的形式为函数的嵌套,突破了函数只能用内部变量的限制
既能访问外部变量,又能保证数据安全

闭包
定义双层嵌套函数,内层函数可以访问外层函数的变量;将内层函数作为外层函数的返回,此内层函数就是闭包函数吗,这种现象为闭包现象
即:里面访问外面

def outer(logo):

    def inner(msg):
        print(f"{logo} {msg}")
    # 返回inner函数
    return inner

fn1 = outer("python")
fn1("666")

fn2 = outer("C++")
fn2("NB")

outer("python")("1")

闭包中修改外部函数的值,在内部函数中对外部函数变量加上nonlocal
内部函数依赖的外部变量本质上是外部函数的内部临时变量

def outer(num1):

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

fn = outer(10)
fn(10)			# 20
fn(20)			# 40
fn(10)			# 50

闭包的优点:
1.无需定义全局变量即可实现通过函数,持续访问、修改某个值
2.闭包使用的变量的作用域在函数内,难以被错误地调用修改

闭包的缺点:
由于内部函数储蓄引用外部函数的值,会导致该部分空间一直不被释放

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

atm = account_create()
atm(100)					# 存款:+100,账户余额:100
atm(200)					# 存款:+200,账户余额:300
atm(100, deposit=False)		# 取款:-100,账户余额:200

二、装饰器

本质上是闭包,能在不破坏目标函数原有代码和功能的前提下,为目标函数增加新功能

创建一个闭包函数,在闭包函数内部调用目标函数

def sleep():
    import random
    import time
    print("睡眠中......")
    time.sleep(random.randint(1, 5))
    
'''在原代码的基础上增加功能,在sleep前打印我要睡觉了,sleep之后打印我起床了'''
def outer(func):
    def inner():
        print("我睡觉了")
        func()
        print("我起床了")

    return inner


fn = outer(sleep)
fn()

@装饰器

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

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


sleep()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值