Python进阶中的闭包和装饰器问题

目录

一:首先来了解什么是闭包,闭包的使用

1.闭包:

1.1什么是闭包:

1.2闭包的好处和缺点:

1.3nonlocal关键字的作用

二:了解什么是装饰器,怎么使用装饰器

2.装饰器

2.1什么是装饰器:

2.2装饰器作用:


一:首先来了解什么是闭包,闭包的使用

1.闭包:
1.1什么是闭包:

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

简单闭包的使用:

def out(log):
    #外部函数
    '''
    闭包:函数的嵌套,有点类似于匿名函数的写法
    :param log:
    :return:
    '''
    def inner(mag):
        '''
        嵌套、定义一个内部函数
        :param mag:
        :return:
        '''
        # (f '{}') 字符串格式化
        print(f'<{log}>{mag}<{log}>')
        pass
    #外部函数返回内部函数
    return inner

#获取一个闭包函数对象
fn1=out('黄永利')   #fn1相当于一个函数
fn1('牛皮')

fn2=out('字节跳动')
fn2('太酷辣')

fn3=out('重庆xxx学院')
fn3(666)

运行结果:

简单闭包实现银行存取款atm小案例:

def account_create(initial_anount=0):
    '''
    闭包实现银行账户的存取款操作
    :param initial_anount:
    :return:
    '''
    def atm(num,deposit=True):
        nonlocal initial_anount
        print(f'账户剩余存款:{initial_anount}')
        if deposit:
            initial_anount+=num
            print(f'存款:+{num},账户余额:{initial_anount}')
            pass
        else:
            initial_anount-=num
            print(f'存款:-{num},账户余额:{initial_anount}')
            pass
        pass
    return atm
fn=account_create(1000)
fn(1000,deposit=True)
fn(100,deposit=False)

运行结果:

1.2闭包的好处和缺点:

优点: 不用定义全局变量,也可以让函数持续访问和修改一个外部变量;
      闭包函数引用的外部变量,是外层函数的内部变量。
      作用域封闭不容易被误操作修改。

缺点: 额外的内存占用。(无法正常释放内存空间)


1.3nonlocal关键字的作用

在闭包函数(内部函数中)可以修改外部函数的变量值
方法:用nonlocla声明这个外部变量。


二:了解什么是装饰器,怎么使用装饰器

2.装饰器
2.1什么是装饰器:

装饰器就是使用创建的闭包函数,在闭包函数内调用目标函数。

简单装饰器的使用:

# def outer(func):
#     '''
#     简单装饰器的定义应用 (一般写法)
#     :param func:
#     :return:
#     '''
#     def inner():
#         print('我睡觉了')
#         func()       #添加函数功能做装饰
#         print('我睡醒了')
#         pass
#     return inner
#
# def sleep():
#     import random
#     import time
#     print('睡眠中...')
#     time.sleep(random.randint(1,5))
#     pass
# fn=outer(sleep)
# fn()

##注释快捷:选中要注释的代码+ctrl+c
##取消注释:选中注释了的代码+ctrl+c


def outer(func):
    '''
    简单装饰器的定义应用 (快捷写法也称语法糖)
    :param func:
    :return:
    '''
    def inner():
        print('我睡觉了')
        func()       #添加函数功能做装饰
        print('我睡醒了')
        pass
    return inner

@outer     #快捷调用方法
def sleep():
    import random
    import time
    print('睡眠中...')
    time.sleep(random.randint(1,5))
    pass
# fn=outer(sleep)
# fn()
sleep()

代码调试运行结果:


2.2装饰器作用:

可以达到不改动目标函数的同时,添加额外的功能。

*注意*与包的区别:

       装饰器实质上是一个闭包函数,只是装饰器这个闭包函数的参数有且只有一个并且是函数类型的话,他才是装饰器,否则也只是一个闭包函数!


以上就是个人对python中的闭包函数和装饰器函数的简单理解,有更好见解的小伙伴,欢迎评论区留言一起讨论。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值