Python函数的闭包和装饰器

兄弟们,Python函数基础已经搞完,准备开始面向对象了,加油吧程序猿!

#函数的引用
# def test():
#      print('---in test func---')
# test()           #调用函数
# res=test         #理解为变量的赋值
# print(id(res))
# print(id(test))

# 闭包
# 闭包是函数内部定义的函数
# 1)闭包是嵌套在函数中的函数
# 2)闭包必须是内层函数对外层函数变量(非全局变量)的引用

# 构成条件
# 1)函数中的嵌套一个函数
# 2)内层嵌套函数,对外部作用域有一个非全局变量的引用
# 3)外层函数的返回值是内存函数的函数名

# def outF():
#     sum=n
#     def inF(n):
#         return sum+1
#     return inF   #外层函数的返回值是内存函数的函数名


def outer_func():
    message = "Hello"

    def inner_func():
        print(message)
    return inner_func
l=outer_func
l()
# 闭包的作用:
# 保存局部信息不被销毁,保存数据的案例性
# 闭包的应用:
# 1)可以保存一些非全局变量但是不易被销毁,改变的数据
# 2)装饰器
# 3)实现数据锁定

# 函数的嵌套
# def outer():
#     n=10
#     def inner():
#         n=20
#         print('inner函数',n)
#     print('outer的函数',n)
#     inner()
# outer()
# 改成闭包形式
# def outer(m):
#     n=10
#     def inner():
#         print('inner函数',m+n)
#     return inner
# me=outer(200)

me()

# 修改外部函数中的变量
# def outer(a):
#     def inner():
#         nonlocal a
#         a+=1
#         print('a的值为',a)
#     return  inner
# m=outer(2)
# m()

# 装饰器 本质是一个闭包函数,
# 装饰器的使用方法:
# 1.先定义一个装饰函数(帽子)(也可以用类偏函数实现)
# 2.再定义你的业务函数或者类(人)--这是真正要执行的
# 3.最后把这顶帽子带在这个人头上

# 装饰器的模板
# def wrapper(func):
#     def inner(*args,**kwargs):
#         res=func(*args,**kwargs)
#         return res
#     return inner

# 日志打印器
def logger(func: object) -> object:
    def wrapper(*args):
        print('我准备开始计算:{}函数了:'.format(func.__name__))
        # 真正执行的业务函数
        func(*args)
        print('计算完了,给自己加个鸡腿 ')
    return wrapper


# 第一种方法
@logger  #语法糖
def add(x,y):
    print('{}+{}={}'.format(x,y,x+y))

# 使用装饰器来装饰函数
# 把函数名add作为参数传入到装饰函数--装饰功能本质
#  第一种方法
# te=logger(add)
# te(100,50)

# 第二种方法
add(200,100)

# 为什么不使用函数的封装,给它添加额外功能,而要使用装饰器?
# 因为装饰器可以实现代码的复用
@logger
def foo():
    print('this is for you higui')
foo()

# 装饰器的参数
# 1.被装饰的函数无参数logger()
# 2.被装饰函数有参数logger(a,b)
# 3.被装饰函数有不定长的参数logger(*agrs),logger(*args)

# 回调函数
def test3(m,n):
    if m==2:
        n()
def one():
    print('hanhusy')
def two():
    print('hanshuer')
test3(1,one)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值