python笔记(四)—— 闭包和装饰器

一:闭包

格式:

def 外部函数:
    def 内部函数:
        pass
    return 内部函数的引用(地址)

例子:

"""
闭包:在函数fn里面定义一个函数(如:inner()),inner中调用了fn(inner外)的变量,
并且fn返回的是inner的引用
"""
def decorator(fn):
    def inner():
        print("--1 闭包:我是inner--")
        fn()
        print("--2 闭包:我是inner--")
    return inner

def test():
    print("--我是test--")

fun = decorator(test)
print(fun())

输出:

二:装饰器(@XXX)

例子:

def one(func):
    print("--我是装饰器--")
    def one_inner():
        print("---1---")
        return "<one>" + func() + "</one>"

    return one_inner

def two(func):
    def two_inner():
        print("--2--")
        return "<two>" + func() + "</two>"

    return two_inner

@one
def test():
    print("---3---")
    return "hello word"

print(test)    # 函数test的地址
ret = test()
print(ret)

输出:

有结果可以看出在执行函数之前就执行了装饰器

2.2 多个装饰器

修改下列这段代码,添加 two 装饰器

@one
@two
def test():
    print("---3---")
    return "hello word"

输出:

2.3 装饰带参函数

def decorator(fn):
    def inner(*args, **keywords):        #可接受任意参数
        fn(*args, **keywords)      #拆包
    return inner

@decorator
def test(a, b):
    print("a + b:", a + b)

test(3, 5)

结果:    a + b:8

2.4  装饰带有返回值的函数

def func(funcName):
    print("--func--1--")
    def func_in():
        print("--func_in--1--")
        ret = funcName()    #保存返回值,此处为 "hello world"
        print("--func_in--2--")
        return ret      #返回 "hello world" 
    print("--func--2--")
    return func_in

@func
def test():
    print("--我是 test --")
    return "hello world"

ret = test()
print("test return value:", ret)

输出:

--func--1--
--func--2--
--func_in--1--
--我是 test --
--func_in--2--

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值