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