闭包和装饰器

闭包
    函数作为参数使用
        函数名
            指向这个函数在 内存中的一个引用地址
            函数是可以作为函数的参数去使用的
        函数传参和赋值操作,本质都是引用地址的传递
    闭包形成的条件
        闭包的作用
            保存函数内部的变量
            让函数内部的变量不会随着函数调用结束而销毁
        闭包函数形成的条件
            函数嵌套的定义
                在一个函数(外部函数)中又定义另外的一个函数(内部函数)
                内部函数使用外部函数的变量,外部函数的便是,外部函数中定义的局部变量,外部函数中的参数
                外部函数返回内部函数名,外部函数返回内部函数 的引用地址
                注:内部函数使用外部函数的变量的时候,如果需要修改该变量的值,需要使用nonlocal 变量名  来声明变量,如果只是使用,则不用。有点类似函数声明全局变量。
        闭包函数的执行流程

装饰器
    装饰器的作用
        在不改变原函数代码的基础上,以及不改变调用方式,给函数增加新的功能
        装饰器的本质就是一个闭包函数

闭包函数的执行流程


    案例
        装饰器装饰带有参数的函数

# 装饰器装饰带有参数的函数
# 写一个装饰器,装饰一下上述的foo函数  增加功能, 在计算之前,输出一句话,开始进行计算......
def func_outer(func):
    def func_inner(a,b):
        print("开始计算")
        func(a,b)

    return func_inner

@func_outer
def foo(a,b):
    print(f"{a}+{b} = {a+b}")

执行流程


        

装饰器装饰带有返回值的函数

# # 装饰器装饰带有返回值的函数
# # 函数中有返回值。 通过装饰器增加功能,在计算之前 输出 开始进行计算
def func_outer(func):
    def func_inner(a,b):
        print("开始进行计算")
        return func(a,b)
    return func_inner

@func_outer
def foo(a,b):
    return a+b

result = foo(10,20)
print(f"计算之后的结果为:{result}")


        装饰器装饰带有不定长的函数(通用装饰器)

#装饰器装饰带有不定长的函数(通用装饰器)
# 通过装饰器增加功能,在计算之前 输出 开始进行计算
def decorator(func):
    def inner(*args,**kwargs):
        print("开始进行计算。。。")
        return func(*args,**kwargs)
    return inner

@decorator
def foo(*args,**kwargs):
    # 不管传入几个数字,最终计算的就是这些数字的总和, 传入任意个数字,去计算总和
    # args 元组   kwargs 字典
    total_num = 0
    for i in args:
        total_num +=i
    for j in kwargs.values():
        total_num +=j

    return total_num


        装饰器带有参数
 

# 装饰器带有参数
# # 实现一个功能  实现一个装饰器,当我们进行以下函数调用的时候,分别在计算之前输出
# # 开始进行 加法、减法、乘法、除法计算
def decorator(flag):
    def func_outer(func):
        def func_inner(a, b):
            if flag == "+":
                print('增加的功能--开始进行加法计算')
            elif flag == '-':
                print('增加的功能--开始进行减法计算')

            return func(a,b)
        return func_inner
    return func_outer

@decorator('+')
def add(a,b):
    return a+b
print(add(10,20))

 执行流程:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值