教你10分钟读懂python闭包和装饰器

一:闭包

 

先来讲一下闭包的定义,在函数嵌套的情况下,在函数内部使用了外部函数的参数或者变量,并把这个内部函数返回,那么这个返回的函数就叫做闭包。简单来说闭包就是对应一个函数不理解没关系,接下来我们用代码讲解。


def show():  #外部函数
    num = 10   #外部函数的变量
    def inner():  #内部函数
        print(num) #使用外部函数的变量
    return inner  #返回内部函数

new_func = show()
print(new_func)
new_func()

这就是一个简单的闭包,闭包的应用场景通常是,可以根据参数生成不同的返回函数。同样举例说明


"""
普通函数
"""
def hello(msg, count):
    result = msg * count
    return result

result = hello('哈哈', 3)
print(result)

"""
利用闭包
"""
def hello(msg, count):
    def return_msg():
        result = msg * count
        return result
    return return_msg

new_func1 = hello("是我", 4)
result1 =new_func1()
print(new_func1)
print(result1)

new_func2 = hello("是我", 4)
result2 =new_func2()
print(new_func2)
print(result2)

闭包就是这么简单,就是根据条件生成不同函数

二:装饰器

同样简单讲下什么是装饰器,装饰器本质也是一个函数,它实现的是对原函数的功能进行扩展,好处就是,可以不改变原函数的定义,和调用方式。

同样,举例说明


def work():
    print('I am working...')

work()

你写了这样一个函数,老板说,小伙子,你工作的很好,在I am working...前给我加几个横线。不能改变这个函数的定义和调用方式。

ok,开始改造

def decorator(new_func):
    def inner():
        print('---' * 10)
        new_func()
    return inner

@decorator #语法糖,直接调用decorator函数,等价  work = decorator(work)
def work():
    print('I am working...')

work()

ok,改造完成,升职加薪。这下老板来了,小伙子干的漂亮,我这还有一个带参数的函数,你帮我改造下,在输出结果前加上一句话,“输出结果是“,我们来看下原函数。

def work(num1, num2):
    result = num1 + num2
    print(result)

work(1, 2)

改造开始!

def decorator(new_func):
    def inner(num1, num2): #加上原函数的参数
        print('输出结果是:')
        new_func(num1, num2) #加上原函数的参数
    return inner

@decorator #语法糖,直接调用decorator函数,等价  work = decorator(work)
def work(num1, num2):
    result = num1 + num2
    print(result)

work(1, 2)

老板:不错不错,你再给我在work函数后面加个return,把resut,return回去。你心里骂了句mmp,然后直接加了个return,此时

程序运行结果。

没有运行结果。你仔细看了下程序分析了原因。

当我们调用work时候,开始执行装饰器,然后执行inner函数,相当于执行work函数,work函数将返回值给了inner函数,但是inner函数并没有将返回值给work函数。稍加改造,将new_func返回即可。

代码示例如下。

"""
Created by Young on 2019/2/15 10:05
"""
def decorator(new_func):
    def inner(num1, num2): #加上原函数的参数
        print('输出结果是:')
        return new_func(num1, num2) #加上原函数的参数
    return inner

@decorator #语法糖,直接调用decorator函数,等价  work = decorator(work)
def work(num1, num2):
    result = num1 + num2
    return result

result = work(1, 2)
print(result)

ok,接下来万恶的老板布置了新任务,你给我写一个通用的装饰器吧,一秒完成一个可以兼容任意参数和有无返回值的装饰器。

def decorator(new_func):
    def inner(*args, **kwargs):
        print('输出结果是:')
        return new_func(*args, **kwargs) 
    return inner

老板说,你给这个装饰器加一个参数吧,这难得到你吗?肯定不。

我们选择在装饰器外面嵌套一个函数传参,即可完成。看代码示例

def get_decorator(char):
    def decorator(new_func):
        def inner(*args, **kwargs):
            print(char)
            return new_func(*args, **kwargs)
        return inner
    return decorator

@get_decorator('我是参数') #语法糖,直接调用decorator函数,等价  work = decorator(work)
def work(num1, num2):
    result = num1 + num2
    return result

result = work(1, 2)
print(result)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值